@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
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Fallback (chain) ModelAdapter — @deprecated.
3
+ *
4
+ * @deprecated Use `LlmRouter` from `./router/index.js` instead. The router
5
+ * supplies per-error retry policies, rate limits, spend ledger, circuit
6
+ * breakers, and OTel routing spans; this `ModelAdapter`-shaped chain
7
+ * predates all of that.
8
+ *
9
+ * Kept as a no-op shim for backwards compat: it preserves the original
10
+ * behavior (single `maxRetries` knob + fixed delay) while flagging the
11
+ * call site for migration. New callers should construct an `LlmRouter`
12
+ * with a `RouteConfig` instead. Migration recipe:
13
+ *
14
+ * // before:
15
+ * const adapter = new FallbackAdapter([sonnet, haiku], 2, 1000);
16
+ *
17
+ * // after:
18
+ * const router = new LlmRouter({
19
+ * config: {
20
+ * routes: [{
21
+ * tag: 'planner',
22
+ * primary: 'claude-sonnet-4-6',
23
+ * fallbacks: [{ model: 'claude-haiku-4-5-20251001' }],
24
+ * }],
25
+ * retryPolicy: DEFAULT_RETRY_POLICY,
26
+ * },
27
+ * resolver: { resolve: (modelId) => registry.resolveFromModelId(modelId) },
28
+ * });
29
+ * const out = await router.invoke({ tag: 'planner', prompt: '...' });
30
+ */
31
+ import type { ModelAdapter, ModelAdapterConfig, ModelAdapterResult, ProviderCapabilities, ProviderName } from './types.js';
32
+ /** @deprecated Use {@link LlmRouter} instead. */
33
+ export declare class FallbackAdapter implements ModelAdapter {
34
+ private chain;
35
+ private maxRetries;
36
+ private retryDelayMs;
37
+ /** @deprecated Use {@link LlmRouter} instead. */
38
+ constructor(chain: ModelAdapter[], maxRetries?: number, retryDelayMs?: number);
39
+ get provider(): ProviderName;
40
+ get capabilities(): ProviderCapabilities;
41
+ supportsModel(modelId: string): boolean;
42
+ getModelPricing(modelId: string): [number, number] | null;
43
+ checkAvailability(): Promise<{
44
+ available: boolean;
45
+ version?: string;
46
+ error?: string;
47
+ }>;
48
+ run(config: ModelAdapterConfig, output: NodeJS.WritableStream): Promise<ModelAdapterResult>;
49
+ kill(): void;
50
+ }
51
+ //# sourceMappingURL=fallback-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-adapter.d.ts","sourceRoot":"","sources":["../src/fallback-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACb,MAAM,YAAY,CAAC;AAepB,iDAAiD;AACjD,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAE7B,iDAAiD;gBAE/C,KAAK,EAAE,YAAY,EAAE,EACrB,UAAU,GAAE,MAAU,EACtB,YAAY,GAAE,MAAa;IAU7B,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,IAAI,YAAY,IAAI,oBAAoB,CAEvC;IAED,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIvC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQnD,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAUtF,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkCjG,IAAI,IAAI,IAAI;CAOb"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Fallback (chain) ModelAdapter — @deprecated.
3
+ *
4
+ * @deprecated Use `LlmRouter` from `./router/index.js` instead. The router
5
+ * supplies per-error retry policies, rate limits, spend ledger, circuit
6
+ * breakers, and OTel routing spans; this `ModelAdapter`-shaped chain
7
+ * predates all of that.
8
+ *
9
+ * Kept as a no-op shim for backwards compat: it preserves the original
10
+ * behavior (single `maxRetries` knob + fixed delay) while flagging the
11
+ * call site for migration. New callers should construct an `LlmRouter`
12
+ * with a `RouteConfig` instead. Migration recipe:
13
+ *
14
+ * // before:
15
+ * const adapter = new FallbackAdapter([sonnet, haiku], 2, 1000);
16
+ *
17
+ * // after:
18
+ * const router = new LlmRouter({
19
+ * config: {
20
+ * routes: [{
21
+ * tag: 'planner',
22
+ * primary: 'claude-sonnet-4-6',
23
+ * fallbacks: [{ model: 'claude-haiku-4-5-20251001' }],
24
+ * }],
25
+ * retryPolicy: DEFAULT_RETRY_POLICY,
26
+ * },
27
+ * resolver: { resolve: (modelId) => registry.resolveFromModelId(modelId) },
28
+ * });
29
+ * const out = await router.invoke({ tag: 'planner', prompt: '...' });
30
+ */
31
+ import { emitContent } from './stream-format.js';
32
+ // ---------------------------------------------------------------------------
33
+ // Helpers
34
+ // ---------------------------------------------------------------------------
35
+ function delay(ms) {
36
+ return new Promise((resolve) => setTimeout(resolve, ms));
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // Adapter
40
+ // ---------------------------------------------------------------------------
41
+ /** @deprecated Use {@link LlmRouter} instead. */
42
+ export class FallbackAdapter {
43
+ chain;
44
+ maxRetries;
45
+ retryDelayMs;
46
+ /** @deprecated Use {@link LlmRouter} instead. */
47
+ constructor(chain, maxRetries = 1, retryDelayMs = 2000) {
48
+ if (chain.length === 0) {
49
+ throw new Error('FallbackAdapter requires at least one adapter in the chain');
50
+ }
51
+ this.chain = chain;
52
+ this.maxRetries = maxRetries;
53
+ this.retryDelayMs = retryDelayMs;
54
+ }
55
+ get provider() {
56
+ return this.chain[0].provider;
57
+ }
58
+ get capabilities() {
59
+ return this.chain[0].capabilities;
60
+ }
61
+ supportsModel(modelId) {
62
+ return this.chain.some((adapter) => adapter.supportsModel(modelId));
63
+ }
64
+ getModelPricing(modelId) {
65
+ for (const adapter of this.chain) {
66
+ const pricing = adapter.getModelPricing(modelId);
67
+ if (pricing !== null)
68
+ return pricing;
69
+ }
70
+ return null;
71
+ }
72
+ async checkAvailability() {
73
+ const errors = [];
74
+ for (const adapter of this.chain) {
75
+ const result = await adapter.checkAvailability();
76
+ if (result.available)
77
+ return result;
78
+ if (result.error)
79
+ errors.push(`${adapter.provider}: ${result.error}`);
80
+ }
81
+ return { available: false, error: errors.join('; ') };
82
+ }
83
+ async run(config, output) {
84
+ const errors = [];
85
+ for (const adapter of this.chain) {
86
+ const maxAttempts = this.maxRetries + 1;
87
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
88
+ try {
89
+ return await adapter.run(config, output);
90
+ }
91
+ catch (err) {
92
+ const message = err instanceof Error ? err.message : String(err);
93
+ errors.push(`${adapter.provider}[attempt ${attempt + 1}]: ${message}`);
94
+ const isLastAttemptForAdapter = attempt === maxAttempts - 1;
95
+ const isLastAdapter = adapter === this.chain[this.chain.length - 1];
96
+ if (isLastAttemptForAdapter && !isLastAdapter) {
97
+ emitContent(output, `[Anvil] Provider ${adapter.provider} failed (${message}), trying next...`);
98
+ }
99
+ else if (!isLastAttemptForAdapter) {
100
+ // Retry the same adapter after a delay
101
+ await delay(this.retryDelayMs);
102
+ }
103
+ }
104
+ }
105
+ }
106
+ throw new Error(`All providers in the fallback chain failed:\n${errors.map((e) => ` - ${e}`).join('\n')}`);
107
+ }
108
+ kill() {
109
+ for (const adapter of this.chain) {
110
+ if (adapter.kill) {
111
+ adapter.kill();
112
+ }
113
+ }
114
+ }
115
+ }
116
+ //# sourceMappingURL=fallback-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-adapter.js","sourceRoot":"","sources":["../src/fallback-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Google Gemini adapter — HTTP API via native fetch(), no npm dependencies.
3
+ *
4
+ * Auth: GOOGLE_API_KEY or GEMINI_API_KEY env var.
5
+ * Streaming: SSE (alt=sse) with GenerateContentResponse JSON payloads.
6
+ */
7
+ import type { ModelAdapter, ModelAdapterConfig, ModelAdapterResult, ProviderCapabilities } from './types.js';
8
+ export declare class GeminiAdapter implements ModelAdapter {
9
+ readonly provider: "gemini";
10
+ readonly capabilities: ProviderCapabilities;
11
+ private abortController;
12
+ supportsModel(modelId: string): boolean;
13
+ getModelPricing(modelId: string): [number, number] | null;
14
+ checkAvailability(): Promise<{
15
+ available: boolean;
16
+ version?: string;
17
+ error?: string;
18
+ }>;
19
+ kill(): void;
20
+ run(config: ModelAdapterConfig, output: NodeJS.WritableStream): Promise<ModelAdapterResult>;
21
+ }
22
+ //# sourceMappingURL=gemini-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-adapter.d.ts","sourceRoot":"","sources":["../src/gemini-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AA4BpB,qBAAa,aAAc,YAAW,YAAY;IAChD,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAEtC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAczC;IAEF,OAAO,CAAC,eAAe,CAAgC;IAEvD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIvC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAInD,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ5F,IAAI,IAAI,IAAI;IAON,GAAG,CACP,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,MAAM,CAAC,cAAc,GAC5B,OAAO,CAAC,kBAAkB,CAAC;CAyI/B"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Google Gemini adapter — HTTP API via native fetch(), no npm dependencies.
3
+ *
4
+ * Auth: GOOGLE_API_KEY or GEMINI_API_KEY env var.
5
+ * Streaming: SSE (alt=sse) with GenerateContentResponse JSON payloads.
6
+ */
7
+ import { emitContent, emitThinking, emitResult } from './stream-format.js';
8
+ import { UpstreamError } from './upstream-error.js';
9
+ const API_BASE = 'https://generativelanguage.googleapis.com/v1beta/models';
10
+ const PRICING = {
11
+ 'gemini-2.5-pro': [1.25, 10.0],
12
+ 'gemini-2.5-flash': [0.30, 2.50],
13
+ 'gemini-2.5-flash-lite': [0.10, 0.40],
14
+ 'gemini-2.0-flash': [0.10, 0.40],
15
+ };
16
+ function getApiKey() {
17
+ return process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;
18
+ }
19
+ function computeCost(modelId, inputTokens, outputTokens) {
20
+ const pricing = PRICING[modelId];
21
+ if (!pricing)
22
+ return 0;
23
+ const [inputPer1M, outputPer1M] = pricing;
24
+ return (inputTokens / 1_000_000) * inputPer1M + (outputTokens / 1_000_000) * outputPer1M;
25
+ }
26
+ export class GeminiAdapter {
27
+ provider = 'gemini';
28
+ capabilities = {
29
+ tier: 'function-calling',
30
+ streaming: true,
31
+ toolUse: true,
32
+ fileSystem: false,
33
+ shellExecution: false,
34
+ sessionResume: false,
35
+ promptCaching: true,
36
+ cache: 'auto',
37
+ cacheTtlSeconds: 600,
38
+ structuredOutput: 'strict',
39
+ // The Gemini HTTP API supports generationConfig.maxOutputTokens; today's
40
+ // adapter does not forward it. Flip to true once the adapter wires it up.
41
+ maxOutputTokens: false,
42
+ };
43
+ abortController = null;
44
+ supportsModel(modelId) {
45
+ return modelId.startsWith('gemini-');
46
+ }
47
+ getModelPricing(modelId) {
48
+ return PRICING[modelId] ?? null;
49
+ }
50
+ async checkAvailability() {
51
+ const key = getApiKey();
52
+ if (!key) {
53
+ return { available: false, error: 'GOOGLE_API_KEY or GEMINI_API_KEY not set' };
54
+ }
55
+ return { available: true };
56
+ }
57
+ kill() {
58
+ if (this.abortController) {
59
+ this.abortController.abort();
60
+ this.abortController = null;
61
+ }
62
+ }
63
+ async run(config, output) {
64
+ const key = getApiKey();
65
+ if (!key) {
66
+ throw new Error('Gemini API key not found. Set GOOGLE_API_KEY or GEMINI_API_KEY.');
67
+ }
68
+ const { model, userPrompt, projectPrompt } = config;
69
+ const url = `${API_BASE}/${model}:streamGenerateContent?alt=sse&key=${key}`;
70
+ const body = {
71
+ contents: [
72
+ {
73
+ parts: [{ text: userPrompt }],
74
+ role: 'user',
75
+ },
76
+ ],
77
+ };
78
+ if (projectPrompt) {
79
+ body.systemInstruction = { parts: [{ text: projectPrompt }] };
80
+ }
81
+ this.abortController = new AbortController();
82
+ const startMs = Date.now();
83
+ let fullText = '';
84
+ let inputTokens = 0;
85
+ let outputTokens = 0;
86
+ let thinkingTokens = 0;
87
+ let cacheReadTokens = 0;
88
+ const response = await fetch(url, {
89
+ method: 'POST',
90
+ headers: { 'Content-Type': 'application/json' },
91
+ body: JSON.stringify(body),
92
+ signal: this.abortController.signal,
93
+ });
94
+ if (!response.ok) {
95
+ const errBody = await response.text();
96
+ throw new UpstreamError(response.status, errBody, { provider: 'gemini' });
97
+ }
98
+ if (!response.body) {
99
+ throw new UpstreamError(0, 'Gemini API returned no response body', { provider: 'gemini' });
100
+ }
101
+ // Read the SSE stream
102
+ const reader = response.body.getReader();
103
+ const decoder = new TextDecoder();
104
+ let buffer = '';
105
+ while (true) {
106
+ const { done, value } = await reader.read();
107
+ if (done)
108
+ break;
109
+ buffer += decoder.decode(value, { stream: true });
110
+ // Process complete lines
111
+ const lines = buffer.split('\n');
112
+ // Keep the last (potentially incomplete) line in the buffer
113
+ buffer = lines.pop() ?? '';
114
+ for (const line of lines) {
115
+ const trimmed = line.trim();
116
+ if (!trimmed || !trimmed.startsWith('data: '))
117
+ continue;
118
+ const jsonStr = trimmed.slice(6); // strip "data: "
119
+ if (!jsonStr)
120
+ continue;
121
+ let chunk;
122
+ try {
123
+ chunk = JSON.parse(jsonStr);
124
+ }
125
+ catch {
126
+ continue; // skip malformed lines
127
+ }
128
+ // Extract text content
129
+ const candidates = chunk.candidates;
130
+ if (candidates && candidates.length > 0) {
131
+ const content = candidates[0].content;
132
+ if (content) {
133
+ const parts = content.parts;
134
+ if (parts && parts.length > 0 && typeof parts[0].text === 'string') {
135
+ const text = parts[0].text;
136
+ fullText += text;
137
+ emitContent(output, text);
138
+ }
139
+ }
140
+ }
141
+ // Track usage (cumulative — last chunk has final counts)
142
+ const usage = chunk.usageMetadata;
143
+ if (usage) {
144
+ if (typeof usage.promptTokenCount === 'number') {
145
+ inputTokens = usage.promptTokenCount;
146
+ }
147
+ if (typeof usage.candidatesTokenCount === 'number') {
148
+ outputTokens = usage.candidatesTokenCount;
149
+ }
150
+ if (typeof usage.thoughtsTokenCount === 'number' && usage.thoughtsTokenCount > 0) {
151
+ if (usage.thoughtsTokenCount > thinkingTokens) {
152
+ emitThinking(output, `[thinking: ${usage.thoughtsTokenCount} tokens]`);
153
+ thinkingTokens = usage.thoughtsTokenCount;
154
+ }
155
+ }
156
+ if (typeof usage.cachedContentTokenCount === 'number') {
157
+ cacheReadTokens = usage.cachedContentTokenCount;
158
+ }
159
+ }
160
+ }
161
+ }
162
+ const durationMs = Date.now() - startMs;
163
+ const costUsd = computeCost(model, inputTokens, outputTokens);
164
+ emitResult(output, {
165
+ text: fullText,
166
+ costUsd,
167
+ inputTokens,
168
+ outputTokens,
169
+ durationMs,
170
+ });
171
+ this.abortController = null;
172
+ return {
173
+ output: fullText,
174
+ inputTokens,
175
+ outputTokens,
176
+ costUsd,
177
+ durationMs,
178
+ provider: 'gemini',
179
+ model,
180
+ cacheReadTokens,
181
+ reasoningTokens: thinkingTokens,
182
+ };
183
+ }
184
+ }
185
+ //# sourceMappingURL=gemini-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-adapter.js","sourceRoot":"","sources":["../src/gemini-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Gemini CLI ModelAdapter.
3
+ *
4
+ * Spawns the `gemini` CLI binary (from `@google/gemini-cli`).
5
+ * The Gemini CLI does not support `--output-format stream-json`, so we
6
+ * accumulate all stdout text and then emit Anvil Stream Format on completion
7
+ * using the stream-format helpers.
8
+ */
9
+ import type { ModelAdapter, ModelAdapterConfig, ModelAdapterResult, ProviderCapabilities, ProviderName } from './types.js';
10
+ export declare class GeminiCliAdapter implements ModelAdapter {
11
+ readonly provider: ProviderName;
12
+ readonly capabilities: ProviderCapabilities;
13
+ private child;
14
+ supportsModel(_modelId: string): boolean;
15
+ getModelPricing(modelId: string): [number, number] | null;
16
+ checkAvailability(): Promise<{
17
+ available: boolean;
18
+ version?: string;
19
+ error?: string;
20
+ }>;
21
+ run(config: ModelAdapterConfig, output: NodeJS.WritableStream): Promise<ModelAdapterResult>;
22
+ kill(): void;
23
+ }
24
+ //# sourceMappingURL=gemini-cli-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-cli-adapter.d.ts","sourceRoot":"","sources":["../src/gemini-cli-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACb,MAAM,YAAY,CAAC;AA4CpB,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAgB;IAE/C,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAYzC;IAEF,OAAO,CAAC,KAAK,CAA6B;IAE1C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMxC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAInD,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAUtF,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkGjG,IAAI,IAAI,IAAI;CAMb"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Gemini CLI ModelAdapter.
3
+ *
4
+ * Spawns the `gemini` CLI binary (from `@google/gemini-cli`).
5
+ * The Gemini CLI does not support `--output-format stream-json`, so we
6
+ * accumulate all stdout text and then emit Anvil Stream Format on completion
7
+ * using the stream-format helpers.
8
+ */
9
+ import { spawn, execSync } from 'node:child_process';
10
+ import { emitContent, emitResult } from './stream-format.js';
11
+ import { UpstreamError, synthesizeStatusFromCli } from './upstream-error.js';
12
+ // ---------------------------------------------------------------------------
13
+ // Pricing table — [inputPer1M, outputPer1M]
14
+ // ---------------------------------------------------------------------------
15
+ const PRICING = {
16
+ 'gemini-2.5-pro': [1.25, 10.0],
17
+ 'gemini-2.5-flash': [0.30, 2.50],
18
+ 'gemini-2.5-flash-lite': [0.10, 0.40],
19
+ };
20
+ function pricingForModel(modelId) {
21
+ const lower = modelId.toLowerCase();
22
+ for (const [key, pricing] of Object.entries(PRICING)) {
23
+ if (lower.includes(key))
24
+ return pricing;
25
+ }
26
+ // Default to flash pricing
27
+ return PRICING['gemini-2.5-flash'];
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // Binary resolution
31
+ // ---------------------------------------------------------------------------
32
+ function resolveBinary() {
33
+ return process.env.GEMINI_CLI_BIN ?? 'gemini';
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Token estimation — Gemini CLI doesn't report token counts, so we estimate
37
+ // from character count (roughly 4 chars per token for English text).
38
+ // ---------------------------------------------------------------------------
39
+ function estimateTokens(text) {
40
+ return Math.ceil(text.length / 4);
41
+ }
42
+ // ---------------------------------------------------------------------------
43
+ // Adapter
44
+ // ---------------------------------------------------------------------------
45
+ export class GeminiCliAdapter {
46
+ provider = 'gemini-cli';
47
+ capabilities = {
48
+ tier: 'agentic',
49
+ streaming: true,
50
+ toolUse: true,
51
+ fileSystem: true,
52
+ shellExecution: true,
53
+ sessionResume: false,
54
+ cache: 'auto',
55
+ cacheTtlSeconds: 300,
56
+ structuredOutput: 'strict',
57
+ // Gemini CLI doesn't expose a max-tokens flag today.
58
+ maxOutputTokens: false,
59
+ };
60
+ child = null;
61
+ supportsModel(_modelId) {
62
+ // Gemini CLI adapter is only used when explicitly configured as provider,
63
+ // not for auto-detection by model name.
64
+ return false;
65
+ }
66
+ getModelPricing(modelId) {
67
+ return pricingForModel(modelId);
68
+ }
69
+ async checkAvailability() {
70
+ try {
71
+ const bin = resolveBinary();
72
+ const version = execSync(`${bin} --version`, { encoding: 'utf-8', timeout: 10_000 }).trim();
73
+ return { available: true, version };
74
+ }
75
+ catch (err) {
76
+ return { available: false, error: err.message };
77
+ }
78
+ }
79
+ async run(config, output) {
80
+ const bin = resolveBinary();
81
+ const startTime = Date.now();
82
+ // ---- Build the prompt --------------------------------------------------
83
+ // Project prompt is prepended to the user prompt since Gemini CLI doesn't
84
+ // have a separate --project-prompt flag.
85
+ const fullPrompt = config.projectPrompt
86
+ ? `${config.projectPrompt}\n\n${config.userPrompt}`
87
+ : config.userPrompt;
88
+ // ---- Build args --------------------------------------------------------
89
+ const args = [fullPrompt];
90
+ // ---- Spawn -------------------------------------------------------------
91
+ const child = spawn(bin, args, {
92
+ cwd: config.workingDir,
93
+ stdio: ['pipe', 'pipe', 'pipe'],
94
+ });
95
+ this.child = child;
96
+ // End stdin immediately — prompt is passed via args
97
+ child.stdin.end();
98
+ // Forward stderr to process.stderr while ALSO buffering it so we
99
+ // can scan for retryable upstream conditions (RESOURCE_EXHAUSTED,
100
+ // quota exceeded, rate limit) on a non-zero exit. Capped to 16 KB.
101
+ let stderrBuf = '';
102
+ const STDERR_CAP = 16 * 1024;
103
+ child.stderr.on('data', (chunk) => {
104
+ process.stderr.write(chunk);
105
+ if (stderrBuf.length < STDERR_CAP) {
106
+ stderrBuf += chunk.toString('utf8').slice(0, STDERR_CAP - stderrBuf.length);
107
+ }
108
+ });
109
+ // ---- Accumulate stdout -------------------------------------------------
110
+ const chunks = [];
111
+ child.stdout.on('data', (chunk) => {
112
+ chunks.push(chunk);
113
+ });
114
+ // ---- Wait for exit -----------------------------------------------------
115
+ const exitCode = await new Promise((resolve, reject) => {
116
+ child.on('close', (code) => resolve(code ?? 0));
117
+ child.on('error', reject);
118
+ });
119
+ this.child = null;
120
+ const durationMs = Date.now() - startTime;
121
+ const fullText = Buffer.concat(chunks).toString('utf-8');
122
+ if (exitCode !== 0 && !fullText.trim()) {
123
+ // Classify from stderr so the dashboard's chain-fallback can hop
124
+ // to another provider on quota / rate-limit / outage. Gemini CLI
125
+ // surfaces these as "RESOURCE_EXHAUSTED", "Quota exceeded",
126
+ // "rate limit exceeded", "429" in the stderr body.
127
+ const synth = synthesizeStatusFromCli(stderrBuf);
128
+ if (synth) {
129
+ throw new UpstreamError(synth.status, stderrBuf || `Gemini CLI exited with code ${exitCode}`, {
130
+ provider: 'gemini-cli',
131
+ retryable: synth.retryable,
132
+ });
133
+ }
134
+ throw new Error(`Gemini CLI exited with code ${exitCode}${stderrBuf ? `\n${stderrBuf.slice(0, 400)}` : ''}`);
135
+ }
136
+ // ---- Emit Anvil Stream Format ------------------------------------------
137
+ const outputText = fullText.trim();
138
+ // Estimate tokens from character count
139
+ const inputTokens = estimateTokens(fullPrompt);
140
+ const outputTokens = estimateTokens(outputText);
141
+ const pricing = pricingForModel(config.model);
142
+ const costUsd = (inputTokens * pricing[0] + outputTokens * pricing[1]) / 1_000_000;
143
+ emitContent(output, outputText);
144
+ emitResult(output, {
145
+ text: outputText,
146
+ costUsd,
147
+ inputTokens,
148
+ outputTokens,
149
+ durationMs,
150
+ });
151
+ // ---- Build result ------------------------------------------------------
152
+ return {
153
+ output: outputText,
154
+ inputTokens,
155
+ outputTokens,
156
+ costUsd,
157
+ durationMs,
158
+ provider: 'gemini-cli',
159
+ model: config.model,
160
+ };
161
+ }
162
+ kill() {
163
+ if (this.child && !this.child.killed) {
164
+ this.child.kill('SIGTERM');
165
+ this.child = null;
166
+ }
167
+ }
168
+ }
169
+ //# sourceMappingURL=gemini-cli-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-cli-adapter.js","sourceRoot":"","sources":["../src/gemini-cli-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @esankhan3/anvil-agent-core — public barrel.
3
+ *
4
+ * What lives here today (Phase 1):
5
+ * - Shared LLM types: `LanguageModel`, `ModelAdapter`, `ProviderName`,
6
+ * `ProviderTier`, `StreamEvent`, `InvokeResult`, etc.
7
+ * - VERSION constant.
8
+ *
9
+ * What will land in subsequent phases:
10
+ * - Phase 2: stream-format types (NDJSON event shapes)
11
+ * - Phase 3: ProviderRegistry singleton
12
+ * - Phase 4: 7 provider adapters
13
+ * - Phase 5: single-shot wrapper (runLLM / runClaude / runGemini)
14
+ * - Phase 6: agent subprocess machinery (AgentManager, spawn, etc.)
15
+ * - Phase 7: cost table loader
16
+ */
17
+ export * from './types.js';
18
+ export * from './stream-format.js';
19
+ export * from './registry.js';
20
+ export { ClaudeAdapter } from './claude-adapter.js';
21
+ export { OpenAIAdapter } from './openai-adapter.js';
22
+ export { GeminiAdapter } from './gemini-adapter.js';
23
+ export { OpenRouterAdapter } from './openrouter-adapter.js';
24
+ export { OllamaAdapter } from './ollama-adapter.js';
25
+ export { GeminiCliAdapter } from './gemini-cli-adapter.js';
26
+ export { AdkAdapter } from './adk-adapter.js';
27
+ export { OpenCodeAdapter } from './opencode-adapter.js';
28
+ export { FallbackAdapter } from './fallback-adapter.js';
29
+ export * from './single-shot.js';
30
+ export * from './agent/index.js';
31
+ export * from './checkpoint/index.js';
32
+ export * from './cost.js';
33
+ export * from './telemetry/index.js';
34
+ export * from './skills/index.js';
35
+ export * from './mcp/index.js';
36
+ export * from './router/index.js';
37
+ export * from './tools/index.js';
38
+ export { VERSION } from './version.js';
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}