@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,233 @@
1
+ /**
2
+ * Claude CLI ModelAdapter.
3
+ *
4
+ * The simplest adapter — Claude CLI already outputs Anvil Stream Format
5
+ * natively (`--output-format stream-json`), so we just pipe stdout through
6
+ * with zero transformation.
7
+ */
8
+ import { spawn, execSync } from 'node:child_process';
9
+ import { createInterface } from 'node:readline';
10
+ import { UpstreamError, synthesizeStatusFromCli } from './upstream-error.js';
11
+ // ---------------------------------------------------------------------------
12
+ // Pricing table — [inputPer1M, outputPer1M]
13
+ // ---------------------------------------------------------------------------
14
+ const PRICING = {
15
+ sonnet: [3.0, 15.0],
16
+ opus: [15.0, 75.0],
17
+ haiku: [0.25, 1.25],
18
+ };
19
+ function pricingKeyFromModel(modelId) {
20
+ const lower = modelId.toLowerCase();
21
+ for (const key of Object.keys(PRICING)) {
22
+ if (lower.includes(key))
23
+ return key;
24
+ }
25
+ return undefined;
26
+ }
27
+ // ---------------------------------------------------------------------------
28
+ // Binary resolution
29
+ // ---------------------------------------------------------------------------
30
+ function resolveBinary() {
31
+ return (process.env.ANVIL_AGENT_CMD ??
32
+ process.env.FF_AGENT_CMD ??
33
+ process.env.CLAUDE_BIN ??
34
+ 'claude');
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Adapter
38
+ // ---------------------------------------------------------------------------
39
+ export class ClaudeAdapter {
40
+ provider = 'claude';
41
+ capabilities = {
42
+ tier: 'agentic',
43
+ streaming: true,
44
+ toolUse: true,
45
+ fileSystem: true,
46
+ shellExecution: true,
47
+ sessionResume: true,
48
+ promptCaching: true,
49
+ cache: 'explicit',
50
+ cacheTtlSeconds: 300,
51
+ structuredOutput: 'tool-shim',
52
+ // Claude CLI doesn't expose a max-tokens flag today; bridges/router callers
53
+ // may pass it but the adapter ignores it.
54
+ maxOutputTokens: false,
55
+ };
56
+ child = null;
57
+ supportsModel(modelId) {
58
+ const lower = modelId.toLowerCase();
59
+ return (lower.startsWith('claude-') ||
60
+ lower.includes('sonnet') ||
61
+ lower.includes('opus') ||
62
+ lower.includes('haiku'));
63
+ }
64
+ getModelPricing(modelId) {
65
+ const key = pricingKeyFromModel(modelId);
66
+ return key ? PRICING[key] : null;
67
+ }
68
+ async checkAvailability() {
69
+ try {
70
+ const bin = resolveBinary();
71
+ const version = execSync(`${bin} --version`, { encoding: 'utf-8', timeout: 10_000 }).trim();
72
+ return { available: true, version };
73
+ }
74
+ catch (err) {
75
+ return { available: false, error: err.message };
76
+ }
77
+ }
78
+ async run(config, output) {
79
+ const bin = resolveBinary();
80
+ const startTime = Date.now();
81
+ // ---- Build args -------------------------------------------------------
82
+ const args = [
83
+ '-p', config.userPrompt,
84
+ '--output-format', 'stream-json',
85
+ '--verbose',
86
+ ];
87
+ if (config.projectPrompt) {
88
+ // Claude CLI's flag is --system-prompt (replaces default) or
89
+ // --append-system-prompt (extends default). The legacy
90
+ // single-shot.ts uses --system-prompt. We follow that convention
91
+ // since the dashboard's projectPrompt is a full persona prompt.
92
+ args.push('--system-prompt', config.projectPrompt);
93
+ }
94
+ if (config.model) {
95
+ args.push('--model', config.model);
96
+ }
97
+ // Claude CLI: --session-id starts a NEW session with that UUID;
98
+ // --resume <id> continues an existing one. The two flags are mutually
99
+ // exclusive — passing both makes the CLI exit non-zero immediately.
100
+ if (config.resume && config.sessionId) {
101
+ args.push('--resume', config.sessionId);
102
+ }
103
+ else if (config.sessionId) {
104
+ args.push('--session-id', config.sessionId);
105
+ }
106
+ else if (config.resume) {
107
+ args.push('--resume');
108
+ }
109
+ if (config.permissionMode) {
110
+ args.push('--permission-mode', config.permissionMode);
111
+ }
112
+ if (config.allowedTools?.length) {
113
+ args.push('--allowedTools', config.allowedTools.join(','));
114
+ }
115
+ if (config.disallowedTools?.length) {
116
+ args.push('--disallowedTools', config.disallowedTools.join(','));
117
+ }
118
+ if (config.mcpConfigPath) {
119
+ // Claude CLI: --mcp-config points at an mcp.json that claude-cli
120
+ // reads to bootstrap MCP server connections. defaultAdapterFactory
121
+ // resolves the path from the spawn's workspaceDir.
122
+ args.push('--mcp-config', config.mcpConfigPath);
123
+ }
124
+ // ---- Spawn ------------------------------------------------------------
125
+ const child = spawn(bin, args, {
126
+ cwd: config.workingDir,
127
+ stdio: ['pipe', 'pipe', 'pipe'],
128
+ });
129
+ this.child = child;
130
+ // End stdin immediately — prompt is passed via args
131
+ child.stdin.end();
132
+ // Forward stderr to process.stderr while ALSO buffering it so we
133
+ // can scan for retryable upstream conditions (rate-limit, quota,
134
+ // overload) on a non-zero exit. Capped to 16 KB to avoid blowing
135
+ // memory on a chatty failure.
136
+ let stderrBuf = '';
137
+ const STDERR_CAP = 16 * 1024;
138
+ child.stderr.on('data', (chunk) => {
139
+ process.stderr.write(chunk);
140
+ if (stderrBuf.length < STDERR_CAP) {
141
+ stderrBuf += chunk.toString('utf8').slice(0, STDERR_CAP - stderrBuf.length);
142
+ }
143
+ });
144
+ // ---- Pipe stdout & capture result in parallel -------------------------
145
+ let resultMsg = null;
146
+ let fullOutput = '';
147
+ let toolCallCount = 0;
148
+ // Anthropic stream-json stamps stop_reason on the assistant frame, not
149
+ // the result frame, so we cache the most recent one and surface it on
150
+ // ModelAdapterResult below.
151
+ let lastStopReason;
152
+ // We read stdout line-by-line to capture the result message while also
153
+ // piping every line to the output writable unchanged.
154
+ const rl = createInterface({ input: child.stdout, crlfDelay: Infinity });
155
+ rl.on('line', (line) => {
156
+ // Pipe through unchanged
157
+ output.write(line + '\n');
158
+ // Try to parse the result message
159
+ try {
160
+ const parsed = JSON.parse(line);
161
+ if (parsed.type === 'result') {
162
+ resultMsg = parsed;
163
+ fullOutput = parsed.result ?? '';
164
+ }
165
+ else if (parsed.type === 'assistant' && Array.isArray(parsed.message?.content)) {
166
+ // Count tool_use blocks for telemetry; pure-pipe semantics preserved.
167
+ for (const block of parsed.message.content) {
168
+ if (block?.type === 'tool_use')
169
+ toolCallCount += 1;
170
+ }
171
+ if (typeof parsed.message?.stop_reason === 'string') {
172
+ lastStopReason = parsed.message.stop_reason;
173
+ }
174
+ }
175
+ }
176
+ catch {
177
+ // Not JSON — pass through silently
178
+ }
179
+ });
180
+ // ---- Wait for exit ----------------------------------------------------
181
+ const exitCode = await new Promise((resolve, reject) => {
182
+ child.on('close', (code) => resolve(code ?? 0));
183
+ child.on('error', reject);
184
+ });
185
+ this.child = null;
186
+ const durationMs = Date.now() - startTime;
187
+ if (exitCode !== 0 && !resultMsg) {
188
+ // Try to classify the failure from stderr so the dashboard's
189
+ // chain-fallback can hop to another provider on a quota/rate-limit
190
+ // hit instead of dying. Anthropic's CLI surfaces these as
191
+ // "rate_limit_error", "overloaded_error", "Credit balance is too
192
+ // low", or HTTP-style status numbers in the stderr body.
193
+ const synth = synthesizeStatusFromCli(stderrBuf);
194
+ if (synth) {
195
+ throw new UpstreamError(synth.status, stderrBuf || `Claude CLI exited with code ${exitCode}`, {
196
+ provider: 'claude',
197
+ retryable: synth.retryable,
198
+ });
199
+ }
200
+ throw new Error(`Claude CLI exited with code ${exitCode}${stderrBuf ? `\n${stderrBuf.slice(0, 400)}` : ''}`);
201
+ }
202
+ // ---- Build result -----------------------------------------------------
203
+ const pricing = this.getModelPricing(config.model) ?? [3.0, 15.0];
204
+ const rm = resultMsg;
205
+ const inputTokens = rm?.usage?.input_tokens ?? 0;
206
+ const outputTokens = rm?.usage?.output_tokens ?? 0;
207
+ const cacheReadTokens = rm?.usage?.cache_read_input_tokens ?? 0;
208
+ const cacheWriteTokens = rm?.usage?.cache_creation_input_tokens ?? 0;
209
+ const costUsd = rm?.total_cost_usd ??
210
+ (inputTokens * pricing[0] + outputTokens * pricing[1]) / 1_000_000;
211
+ return {
212
+ output: fullOutput,
213
+ inputTokens,
214
+ outputTokens,
215
+ costUsd,
216
+ durationMs,
217
+ sessionId: rm?.session_id,
218
+ provider: 'claude',
219
+ model: config.model,
220
+ cacheReadTokens,
221
+ cacheWriteTokens,
222
+ toolCallCount,
223
+ stopReason: lastStopReason,
224
+ };
225
+ }
226
+ kill() {
227
+ if (this.child && !this.child.killed) {
228
+ this.child.kill('SIGTERM');
229
+ this.child = null;
230
+ }
231
+ }
232
+ }
233
+ //# sourceMappingURL=claude-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../src/claude-adapter.ts"],"names":[],"mappings":"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"}
package/dist/cost.d.ts ADDED
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Central cost calculator — backed by a vendored snapshot of LiteLLM's
3
+ * `model_prices_and_context_window.json` (Apache-2.0).
4
+ *
5
+ * The snapshot lives at `data/model-prices.json` (committed). Refresh via
6
+ * `node scripts/refresh-cost-table.mjs` (quarterly + on adding new models).
7
+ *
8
+ * LiteLLM's keys use full versioned model IDs (e.g. `claude-3-5-sonnet-20241022`).
9
+ * Anvil's adapter PRICING tables historically use short canonical names
10
+ * (`sonnet`, `opus`, `haiku`). The `MODEL_ALIASES` table below bridges the
11
+ * two — short name → LiteLLM key. When the loader fails on the literal model
12
+ * ID, it falls back to the alias table.
13
+ *
14
+ * Pricing units in this module:
15
+ * input_cost_per_token / output_cost_per_token from LiteLLM are PER-TOKEN.
16
+ * We convert to PER-1M-TOKENS to match the existing ModelAdapter contract
17
+ * (`getModelPricing(modelId): [number, number] | null` where the tuple is
18
+ * `[inputPer1M, outputPer1M]`).
19
+ */
20
+ /**
21
+ * Look up a model in the cost table.
22
+ *
23
+ * @returns `[inputPer1M, outputPer1M]` in USD, or `null` if the model is
24
+ * unknown. Cache pricing is intentionally NOT exposed via this surface —
25
+ * use `getDetailedPricing` for that.
26
+ */
27
+ export declare function getModelPricing(model: string): [number, number] | null;
28
+ export interface DetailedPricing {
29
+ inputPer1M: number;
30
+ outputPer1M: number;
31
+ cacheReadPer1M?: number;
32
+ cacheWritePer1M?: number;
33
+ maxInputTokens?: number;
34
+ maxOutputTokens?: number;
35
+ }
36
+ /** Detailed pricing including cache columns + context-window limits. */
37
+ export declare function getDetailedPricing(model: string): DetailedPricing | null;
38
+ export interface UsageInput {
39
+ inputTokens: number;
40
+ outputTokens: number;
41
+ cacheReadTokens?: number;
42
+ cacheWriteTokens?: number;
43
+ }
44
+ export interface CostBreakdown {
45
+ totalUsd: number;
46
+ inputUsd: number;
47
+ outputUsd: number;
48
+ cacheReadUsd: number;
49
+ cacheWriteUsd: number;
50
+ }
51
+ /**
52
+ * Compute a per-component cost breakdown.
53
+ *
54
+ * Returns all-zero values when the model isn't in the cost table — caller
55
+ * decides whether to fall back to an adapter-supplied cost (the existing
56
+ * legacy path). Cache components are zero when either the usage doesn't
57
+ * include cache tokens or the pricing entry doesn't list a cache rate.
58
+ */
59
+ export declare function calculateCostBreakdown(model: string, usage: UsageInput): CostBreakdown;
60
+ /**
61
+ * Compute USD cost for a usage block at the given model's pricing.
62
+ * Returns 0 if the model is unknown.
63
+ */
64
+ export declare function calculateCost(model: string, usage: UsageInput): number;
65
+ /** Test seam — clear the in-memory cache. */
66
+ export declare function resetCostTable(): void;
67
+ //# sourceMappingURL=cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAyDH;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAMtE;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAiBxE;AAoBD,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,aAAa,CAoBtF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAEtE;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
package/dist/cost.js ADDED
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Central cost calculator — backed by a vendored snapshot of LiteLLM's
3
+ * `model_prices_and_context_window.json` (Apache-2.0).
4
+ *
5
+ * The snapshot lives at `data/model-prices.json` (committed). Refresh via
6
+ * `node scripts/refresh-cost-table.mjs` (quarterly + on adding new models).
7
+ *
8
+ * LiteLLM's keys use full versioned model IDs (e.g. `claude-3-5-sonnet-20241022`).
9
+ * Anvil's adapter PRICING tables historically use short canonical names
10
+ * (`sonnet`, `opus`, `haiku`). The `MODEL_ALIASES` table below bridges the
11
+ * two — short name → LiteLLM key. When the loader fails on the literal model
12
+ * ID, it falls back to the alias table.
13
+ *
14
+ * Pricing units in this module:
15
+ * input_cost_per_token / output_cost_per_token from LiteLLM are PER-TOKEN.
16
+ * We convert to PER-1M-TOKENS to match the existing ModelAdapter contract
17
+ * (`getModelPricing(modelId): [number, number] | null` where the tuple is
18
+ * `[inputPer1M, outputPer1M]`).
19
+ */
20
+ import { readFileSync } from 'node:fs';
21
+ import { fileURLToPath } from 'node:url';
22
+ import { dirname, join } from 'node:path';
23
+ const __filename = fileURLToPath(import.meta.url);
24
+ const __dirname = dirname(__filename);
25
+ const PRICES_PATH = join(__dirname, 'data', 'model-prices.json');
26
+ let _modelPrices = null;
27
+ function loadModelPrices() {
28
+ if (_modelPrices)
29
+ return _modelPrices;
30
+ try {
31
+ _modelPrices = JSON.parse(readFileSync(PRICES_PATH, 'utf-8'));
32
+ }
33
+ catch (err) {
34
+ process.stderr.write(`[anvil-cost] WARNING: failed to load model-prices.json from ${PRICES_PATH}: ` +
35
+ `${err.message}. Cost calculations will return 0.\n`);
36
+ _modelPrices = {};
37
+ }
38
+ return _modelPrices;
39
+ }
40
+ // ── Anvil short-name → LiteLLM canonical-name aliases ─────────────────────
41
+ /**
42
+ * Bridge table — maps Anvil's short canonical model names (used in
43
+ * `model-router.ts` and adapter PRICING tables) to specific LiteLLM keys.
44
+ * Conservative: each short name resolves to a stable, recent flagship version.
45
+ * Refresh in lockstep with the cost-table snapshot when new flagships ship.
46
+ */
47
+ const MODEL_ALIASES = {
48
+ // Anthropic short names
49
+ 'sonnet': 'claude-sonnet-4-6',
50
+ 'opus': 'claude-opus-4-7',
51
+ 'haiku': 'claude-haiku-4-5',
52
+ 'claude-sonnet-4': 'claude-sonnet-4-6',
53
+ 'claude-opus-4': 'claude-opus-4-7',
54
+ 'claude-haiku-4': 'claude-haiku-4-5',
55
+ };
56
+ // ── Lookup ────────────────────────────────────────────────────────────────
57
+ /**
58
+ * Look up a model in the cost table.
59
+ *
60
+ * @returns `[inputPer1M, outputPer1M]` in USD, or `null` if the model is
61
+ * unknown. Cache pricing is intentionally NOT exposed via this surface —
62
+ * use `getDetailedPricing` for that.
63
+ */
64
+ export function getModelPricing(model) {
65
+ const entry = lookupEntry(model);
66
+ if (!entry || typeof entry.input_cost_per_token !== 'number' || typeof entry.output_cost_per_token !== 'number') {
67
+ return null;
68
+ }
69
+ return [entry.input_cost_per_token * 1_000_000, entry.output_cost_per_token * 1_000_000];
70
+ }
71
+ /** Detailed pricing including cache columns + context-window limits. */
72
+ export function getDetailedPricing(model) {
73
+ const entry = lookupEntry(model);
74
+ if (!entry || typeof entry.input_cost_per_token !== 'number' || typeof entry.output_cost_per_token !== 'number') {
75
+ return null;
76
+ }
77
+ return {
78
+ inputPer1M: entry.input_cost_per_token * 1_000_000,
79
+ outputPer1M: entry.output_cost_per_token * 1_000_000,
80
+ cacheReadPer1M: entry.cache_read_input_token_cost !== undefined
81
+ ? entry.cache_read_input_token_cost * 1_000_000
82
+ : undefined,
83
+ cacheWritePer1M: entry.cache_creation_input_token_cost !== undefined
84
+ ? entry.cache_creation_input_token_cost * 1_000_000
85
+ : undefined,
86
+ maxInputTokens: entry.max_input_tokens,
87
+ maxOutputTokens: entry.max_output_tokens,
88
+ };
89
+ }
90
+ function lookupEntry(model) {
91
+ const prices = loadModelPrices();
92
+ // 1. Exact match.
93
+ if (prices[model])
94
+ return prices[model];
95
+ // 2. Alias bridge.
96
+ const aliased = MODEL_ALIASES[model.toLowerCase()];
97
+ if (aliased && prices[aliased])
98
+ return prices[aliased];
99
+ // 3. Substring match — for short names that didn't make it into MODEL_ALIASES.
100
+ // Iterate aliases first (cheap, small set), then bail.
101
+ const lower = model.toLowerCase();
102
+ for (const [alias, target] of Object.entries(MODEL_ALIASES)) {
103
+ if (lower.includes(alias) && prices[target])
104
+ return prices[target];
105
+ }
106
+ return undefined;
107
+ }
108
+ /**
109
+ * Compute a per-component cost breakdown.
110
+ *
111
+ * Returns all-zero values when the model isn't in the cost table — caller
112
+ * decides whether to fall back to an adapter-supplied cost (the existing
113
+ * legacy path). Cache components are zero when either the usage doesn't
114
+ * include cache tokens or the pricing entry doesn't list a cache rate.
115
+ */
116
+ export function calculateCostBreakdown(model, usage) {
117
+ const p = getDetailedPricing(model);
118
+ if (!p) {
119
+ return { totalUsd: 0, inputUsd: 0, outputUsd: 0, cacheReadUsd: 0, cacheWriteUsd: 0 };
120
+ }
121
+ const inputUsd = (usage.inputTokens / 1_000_000) * p.inputPer1M;
122
+ const outputUsd = (usage.outputTokens / 1_000_000) * p.outputPer1M;
123
+ const cacheReadUsd = usage.cacheReadTokens && p.cacheReadPer1M
124
+ ? (usage.cacheReadTokens / 1_000_000) * p.cacheReadPer1M
125
+ : 0;
126
+ const cacheWriteUsd = usage.cacheWriteTokens && p.cacheWritePer1M
127
+ ? (usage.cacheWriteTokens / 1_000_000) * p.cacheWritePer1M
128
+ : 0;
129
+ return {
130
+ totalUsd: inputUsd + outputUsd + cacheReadUsd + cacheWriteUsd,
131
+ inputUsd,
132
+ outputUsd,
133
+ cacheReadUsd,
134
+ cacheWriteUsd,
135
+ };
136
+ }
137
+ /**
138
+ * Compute USD cost for a usage block at the given model's pricing.
139
+ * Returns 0 if the model is unknown.
140
+ */
141
+ export function calculateCost(model, usage) {
142
+ return calculateCostBreakdown(model, usage).totalUsd;
143
+ }
144
+ /** Test seam — clear the in-memory cache. */
145
+ export function resetCostTable() {
146
+ _modelPrices = null;
147
+ }
148
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"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"}