@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,155 @@
1
+ /**
2
+ * `llm-router.yaml` discovery + parsing.
3
+ *
4
+ * Search order (locked in ADR R5):
5
+ * 1. process.env.ANVIL_ROUTER_CONFIG (full path)
6
+ * 2. <workspaceRoot>/.anvil/llm-router.yaml
7
+ * 3. $HOME/.anvil/llm-router.yaml (or $ANVIL_HOME/llm-router.yaml)
8
+ * 4. compiled-in defaults (router still works without any config file)
9
+ *
10
+ * `${env:VAR}` expansions inside string values are resolved against
11
+ * `process.env` — same convention as the MCP config-loader.
12
+ */
13
+ import { existsSync, readFileSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import { homedir } from 'node:os';
16
+ import * as YAML from 'yaml';
17
+ import { DEFAULT_RETRY_POLICY } from './retry.js';
18
+ import { DEFAULT_RATE_LIMITS } from './rate-limiter.js';
19
+ import { DEFAULT_CIRCUIT_BREAKER } from './circuit-breaker.js';
20
+ /** Returns the path of the canonical `llm-router.yaml`, or undefined. */
21
+ export function findRouterConfigPath(opts = {}) {
22
+ const env = opts.env ?? process.env;
23
+ const home = opts.homeDir ?? homedir();
24
+ const anvilHome = env.ANVIL_HOME ?? join(home, '.anvil');
25
+ const candidates = [];
26
+ if (env.ANVIL_ROUTER_CONFIG)
27
+ candidates.push(env.ANVIL_ROUTER_CONFIG);
28
+ if (opts.workspaceRoot) {
29
+ candidates.push(join(opts.workspaceRoot, '.anvil', 'llm-router.yaml'));
30
+ }
31
+ candidates.push(join(anvilHome, 'llm-router.yaml'));
32
+ for (const c of candidates) {
33
+ if (existsSync(c))
34
+ return c;
35
+ }
36
+ return undefined;
37
+ }
38
+ const ENV_VAR_RE = /\$\{env:([A-Z_][A-Z0-9_]*)\}/g;
39
+ function expandEnv(value, env) {
40
+ if (typeof value === 'string') {
41
+ return value.replace(ENV_VAR_RE, (_m, name) => env[name] ?? '');
42
+ }
43
+ if (Array.isArray(value))
44
+ return value.map((v) => expandEnv(v, env));
45
+ if (value && typeof value === 'object') {
46
+ const out = {};
47
+ for (const [k, v] of Object.entries(value))
48
+ out[k] = expandEnv(v, env);
49
+ return out;
50
+ }
51
+ return value;
52
+ }
53
+ /**
54
+ * Compiled-in defaults that ensure the router functions out-of-the-box
55
+ * when no YAML file is found. Routes default to common Anthropic +
56
+ * OpenAI tags — callers can still pin via `opts.model` if they don't
57
+ * have a matching tag.
58
+ */
59
+ export function defaultRouterConfig() {
60
+ const routes = [
61
+ {
62
+ tag: 'planner',
63
+ primary: 'claude-sonnet-4-6',
64
+ fallbacks: [
65
+ { model: 'claude-haiku-4-5-20251001', on: ['rate_limit', 'server_5xx', 'timeout'] },
66
+ { model: 'gpt-4o', on: ['server_5xx', 'timeout'] },
67
+ ],
68
+ },
69
+ {
70
+ tag: 'code-gen',
71
+ primary: 'claude-sonnet-4-6',
72
+ fallbacks: [
73
+ { model: 'claude-haiku-4-5-20251001', on: ['rate_limit', 'server_5xx', 'timeout'] },
74
+ ],
75
+ },
76
+ {
77
+ tag: 'reviewer',
78
+ primary: 'claude-sonnet-4-6',
79
+ fallbacks: [
80
+ { model: 'gpt-4o', on: ['server_5xx', 'timeout', 'rate_limit'] },
81
+ ],
82
+ },
83
+ ];
84
+ return {
85
+ routes,
86
+ retryPolicy: { ...DEFAULT_RETRY_POLICY },
87
+ rateLimit: { ...DEFAULT_RATE_LIMITS },
88
+ circuitBreaker: { ...DEFAULT_CIRCUIT_BREAKER },
89
+ onRateLimit: 'wait',
90
+ maxFallbackCostUsd: 1.0,
91
+ };
92
+ }
93
+ /**
94
+ * Load + parse the active router config. Returns compiled-in defaults
95
+ * if no YAML file is found (unless `requireFile: true`).
96
+ */
97
+ export function loadRouterConfig(opts = {}) {
98
+ const env = opts.env ?? process.env;
99
+ const path = findRouterConfigPath(opts);
100
+ if (!path) {
101
+ if (opts.requireFile) {
102
+ throw new Error('LlmRouter: no router config file found and requireFile=true');
103
+ }
104
+ return defaultRouterConfig();
105
+ }
106
+ const raw = readFileSync(path, 'utf8');
107
+ const parsed = YAML.parse(raw);
108
+ if (!parsed || typeof parsed !== 'object') {
109
+ throw new Error(`LlmRouter: ${path} is empty or invalid YAML`);
110
+ }
111
+ const expanded = expandEnv(parsed, env);
112
+ return mergeWithDefaults(expanded);
113
+ }
114
+ /**
115
+ * Merge a user config object over the compiled-in defaults. Top-level
116
+ * fields (`routes`, `retryPolicy`, etc.) replace; sub-fields layer.
117
+ */
118
+ export function mergeWithDefaults(input) {
119
+ const defaults = defaultRouterConfig();
120
+ const out = { ...defaults };
121
+ if (Array.isArray(input.routes)) {
122
+ out.routes = input.routes;
123
+ }
124
+ if (input.retryPolicy && typeof input.retryPolicy === 'object') {
125
+ out.retryPolicy = {
126
+ ...defaults.retryPolicy,
127
+ ...input.retryPolicy,
128
+ };
129
+ }
130
+ if (input.rateLimit && typeof input.rateLimit === 'object') {
131
+ out.rateLimit = {
132
+ ...defaults.rateLimit,
133
+ ...input.rateLimit,
134
+ };
135
+ }
136
+ if (input.circuitBreaker && typeof input.circuitBreaker === 'object') {
137
+ out.circuitBreaker = {
138
+ ...(defaults.circuitBreaker ?? DEFAULT_CIRCUIT_BREAKER),
139
+ ...input.circuitBreaker,
140
+ };
141
+ }
142
+ if (input.budgets && typeof input.budgets === 'object') {
143
+ out.budgets = input.budgets;
144
+ }
145
+ if (typeof input.maxFallbackCostUsd === 'number') {
146
+ out.maxFallbackCostUsd = input.maxFallbackCostUsd;
147
+ }
148
+ if (input.onRateLimit === 'wait' ||
149
+ input.onRateLimit === 'fail' ||
150
+ input.onRateLimit === 'fallback') {
151
+ out.onRateLimit = input.onRateLimit;
152
+ }
153
+ return out;
154
+ }
155
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/router/config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Discovery — boot-time pass that pings each model's provider for liveness
3
+ * and writes the result into `registry.availability`. The resolver later
4
+ * consults this map to filter unavailable models.
5
+ *
6
+ * Mutates the registry in place. Idempotent — re-running just refreshes
7
+ * the timestamps. Capability metadata is NEVER changed by this pass; only
8
+ * `availability` is touched.
9
+ */
10
+ import type { ProviderName } from '../types.js';
11
+ import type { ModelRegistry } from './model-registry.js';
12
+ export interface DiscoveryAdapter {
13
+ checkAvailability(): Promise<{
14
+ available: boolean;
15
+ version?: string;
16
+ error?: string;
17
+ }>;
18
+ }
19
+ export interface DiscoveryDeps {
20
+ /** Resolve a provider name to an adapter that can `checkAvailability`. */
21
+ getAdapter(provider: ProviderName): DiscoveryAdapter | undefined;
22
+ now?: () => number;
23
+ }
24
+ export interface DiscoveryOptions {
25
+ /** Per-provider timeout for `checkAvailability`. Default 3000ms. */
26
+ timeoutMs?: number;
27
+ }
28
+ /**
29
+ * Walks the registry, probes each model's provider, and writes the result
30
+ * into `registry.availability`. One probe per UNIQUE provider — adapters
31
+ * report at the provider level, so the result is replicated across all
32
+ * registry entries that share that provider.
33
+ *
34
+ * Returns the same registry reference (mutation), so callers can chain.
35
+ */
36
+ export declare function discoverAvailability(registry: ModelRegistry, deps: DiscoveryDeps, opts?: DiscoveryOptions): Promise<ModelRegistry>;
37
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/router/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxF;AAED,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACjE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,aAAa,EACnB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,aAAa,CAAC,CAyCxB"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Walks the registry, probes each model's provider, and writes the result
3
+ * into `registry.availability`. One probe per UNIQUE provider — adapters
4
+ * report at the provider level, so the result is replicated across all
5
+ * registry entries that share that provider.
6
+ *
7
+ * Returns the same registry reference (mutation), so callers can chain.
8
+ */
9
+ export async function discoverAvailability(registry, deps, opts = {}) {
10
+ const timeoutMs = opts.timeoutMs ?? 3000;
11
+ const now = deps.now ?? Date.now;
12
+ if (!registry.availability)
13
+ registry.availability = new Map();
14
+ const map = registry.availability;
15
+ const providersInUse = new Set();
16
+ for (const m of registry.models)
17
+ providersInUse.add(m.provider);
18
+ const probes = Array.from(providersInUse).map(async (provider) => {
19
+ const adapter = deps.getAdapter(provider);
20
+ if (!adapter) {
21
+ return { provider, result: { available: false, error: 'no adapter registered' } };
22
+ }
23
+ try {
24
+ const result = await raceWithTimeout(adapter.checkAvailability(), timeoutMs);
25
+ return { provider, result };
26
+ }
27
+ catch (err) {
28
+ const error = err instanceof Error ? err.message : String(err);
29
+ return { provider, result: { available: false, error } };
30
+ }
31
+ });
32
+ const settled = await Promise.all(probes);
33
+ const byProvider = new Map();
34
+ for (const { provider, result } of settled) {
35
+ byProvider.set(provider, { available: result.available, error: result.error });
36
+ }
37
+ const ts = now();
38
+ for (const m of registry.models) {
39
+ const probe = byProvider.get(m.provider);
40
+ map.set(m.id, {
41
+ available: probe?.available === true,
42
+ lastChecked: ts,
43
+ error: probe?.error,
44
+ });
45
+ }
46
+ return registry;
47
+ }
48
+ function raceWithTimeout(p, ms) {
49
+ return new Promise((resolve, reject) => {
50
+ const t = setTimeout(() => reject(new Error(`timeout after ${ms}ms`)), ms);
51
+ p.then((v) => { clearTimeout(t); resolve(v); }, (e) => { clearTimeout(t); reject(e); });
52
+ });
53
+ }
54
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/router/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Router error classification + RouterError type.
3
+ *
4
+ * `classifyError` is a best-effort heuristic over (status, code, message).
5
+ * Per ADR R2, providers can register adapter-specific overrides via
6
+ * `RouterConfig.errorClassifiers[provider]` (Phase 2+).
7
+ */
8
+ import type { ErrorClass, RouteAttempt } from './types.js';
9
+ /**
10
+ * Error thrown when the entire route walk fails. Carries the full
11
+ * attempt history so callers can introspect what was tried.
12
+ */
13
+ export declare class RouterError extends Error {
14
+ readonly attempts: ReadonlyArray<RouteAttempt>;
15
+ readonly cause?: Error;
16
+ constructor(message: string, opts: {
17
+ attempts: ReadonlyArray<RouteAttempt>;
18
+ cause?: Error;
19
+ });
20
+ }
21
+ /**
22
+ * Map a raw error to an `ErrorClass`.
23
+ *
24
+ * Recognizes:
25
+ * - 429 → rate_limit
26
+ * - 5xx → server_5xx
27
+ * - 401/403 → auth
28
+ * - 400 + content/safety hints → content_policy
29
+ * - 400 → invalid_request
30
+ * - timeout/abort/etimedout/econnreset/socket-hang-up → timeout
31
+ * - otherwise → unknown
32
+ */
33
+ export declare function classifyError(err: unknown): ErrorClass;
34
+ /**
35
+ * Parse a `Retry-After` header value (seconds-since-now or HTTP-date)
36
+ * into a millisecond delay. Returns `null` if absent or unparseable.
37
+ */
38
+ export declare function parseRetryAfterMs(headers?: Record<string, string | undefined>): number | null;
39
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/router/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3D;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;gBAGrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QAAE,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;CAOjE;AAcD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAkDtD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CAY7F"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Router error classification + RouterError type.
3
+ *
4
+ * `classifyError` is a best-effort heuristic over (status, code, message).
5
+ * Per ADR R2, providers can register adapter-specific overrides via
6
+ * `RouterConfig.errorClassifiers[provider]` (Phase 2+).
7
+ */
8
+ /**
9
+ * Error thrown when the entire route walk fails. Carries the full
10
+ * attempt history so callers can introspect what was tried.
11
+ */
12
+ export class RouterError extends Error {
13
+ attempts;
14
+ cause;
15
+ constructor(message, opts) {
16
+ super(message);
17
+ this.name = 'RouterError';
18
+ this.attempts = opts.attempts;
19
+ this.cause = opts.cause;
20
+ }
21
+ }
22
+ /**
23
+ * Map a raw error to an `ErrorClass`.
24
+ *
25
+ * Recognizes:
26
+ * - 429 → rate_limit
27
+ * - 5xx → server_5xx
28
+ * - 401/403 → auth
29
+ * - 400 + content/safety hints → content_policy
30
+ * - 400 → invalid_request
31
+ * - timeout/abort/etimedout/econnreset/socket-hang-up → timeout
32
+ * - otherwise → unknown
33
+ */
34
+ export function classifyError(err) {
35
+ if (!err)
36
+ return 'unknown';
37
+ const e = err;
38
+ // Network / timeout heuristics first — these can co-exist with no status.
39
+ const codeStr = typeof e.code === 'string' ? e.code.toUpperCase() : '';
40
+ if (codeStr === 'ETIMEDOUT' || codeStr === 'ECONNRESET' || codeStr === 'ECONNABORTED') {
41
+ return 'timeout';
42
+ }
43
+ if (e.name === 'AbortError' || e.name === 'TimeoutError')
44
+ return 'timeout';
45
+ const message = (e.message ?? '').toLowerCase();
46
+ if (message.includes('timeout') || message.includes('timed out') || message.includes('socket hang up')) {
47
+ return 'timeout';
48
+ }
49
+ const status = e.status ?? e.statusCode;
50
+ if (typeof status === 'number') {
51
+ if (status === 429)
52
+ return 'rate_limit';
53
+ if (status >= 500 && status < 600)
54
+ return 'server_5xx';
55
+ if (status === 401 || status === 403)
56
+ return 'auth';
57
+ if (status === 400) {
58
+ // Content-policy filter signals
59
+ const innerType = e.error?.type?.toLowerCase() ?? '';
60
+ const innerCode = e.error?.code?.toLowerCase() ?? '';
61
+ if (innerType.includes('content') ||
62
+ innerType.includes('safety') ||
63
+ innerCode.includes('content_policy') ||
64
+ innerCode.includes('safety') ||
65
+ message.includes('content policy') ||
66
+ message.includes('safety filter') ||
67
+ message.includes('refused')) {
68
+ return 'content_policy';
69
+ }
70
+ return 'invalid_request';
71
+ }
72
+ }
73
+ // Non-status providers (e.g. SDK throws with content_filter type)
74
+ const innerType = e.error?.type?.toLowerCase() ?? '';
75
+ if (innerType.includes('content') || innerType.includes('safety')) {
76
+ return 'content_policy';
77
+ }
78
+ if (e.type && /content|safety/i.test(e.type)) {
79
+ return 'content_policy';
80
+ }
81
+ return 'unknown';
82
+ }
83
+ /**
84
+ * Parse a `Retry-After` header value (seconds-since-now or HTTP-date)
85
+ * into a millisecond delay. Returns `null` if absent or unparseable.
86
+ */
87
+ export function parseRetryAfterMs(headers) {
88
+ if (!headers)
89
+ return null;
90
+ const raw = headers['retry-after'] ?? headers['Retry-After'];
91
+ if (!raw)
92
+ return null;
93
+ const seconds = Number(raw);
94
+ if (Number.isFinite(seconds) && seconds >= 0)
95
+ return Math.round(seconds * 1000);
96
+ const dateMs = Date.parse(raw);
97
+ if (!Number.isNaN(dateMs)) {
98
+ const delta = dateMs - Date.now();
99
+ return delta > 0 ? delta : 0;
100
+ }
101
+ return null;
102
+ }
103
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/router/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `@esankhan3/anvil-agent-core/router` — barrel.
3
+ *
4
+ * Public surface for the LLM router subsystem. See
5
+ * `AGENT-CORE-LLM-ROUTER-PLAN.md` for the phased rollout.
6
+ */
7
+ export type { ErrorClass, RetryPolicy, RouteFallback, RouteConfig, BudgetConfig, CircuitBreakerConfig, RateLimitProviderConfig, RouterConfig, InvokeOpts, RouteAttempt, RouteOutcome, } from './types.js';
8
+ export { ALL_ERROR_CLASSES } from './types.js';
9
+ export { LlmRouter } from './router.js';
10
+ export type { LlmRouterDeps, AdapterResolver } from './router.js';
11
+ export { RouterError, classifyError, parseRetryAfterMs } from './errors.js';
12
+ export { runWithRetry, DEFAULT_RETRY_POLICY } from './retry.js';
13
+ export type { RetryAttempt, RunWithRetryDeps, RunWithRetryResult } from './retry.js';
14
+ export { TokenBucketRateLimiter, RateLimitedError, DEFAULT_RATE_LIMITS, } from './rate-limiter.js';
15
+ export type { RateLimiterDeps } from './rate-limiter.js';
16
+ export { SpendLedger, SPEND_LEDGER_SCHEMA_SQL, defaultSpendLedgerPath, } from './spend-ledger.js';
17
+ export type { SpendRow, SpendQueryOpts } from './spend-ledger.js';
18
+ export { CircuitBreaker, DEFAULT_CIRCUIT_BREAKER } from './circuit-breaker.js';
19
+ export type { CircuitBreakerDeps, CircuitState } from './circuit-breaker.js';
20
+ export { loadRouterConfig, findRouterConfigPath, defaultRouterConfig, mergeWithDefaults, } from './config-loader.js';
21
+ export type { LoadRouterConfigOptions } from './config-loader.js';
22
+ export { invokeWithSpans, ROUTER_INVOKE_SPAN, ROUTER_ATTEMPT_SPAN, RouterAttr, } from './telemetry.js';
23
+ export { loadModelRegistry, parseModelRegistry, findModelsConfigPath, DEFAULT_WALKER_CONFIG, ModelRegistryParseError, ModelRegistryValidationError, } from './model-registry.js';
24
+ export type { ModelEntry, ModelRegistry, ModelAvailability, ModelCapability, ModelComplexity, ModelTier, ModelConsumer, WalkerConfig, LoadModelRegistryOptions, } from './model-registry.js';
25
+ export { resolveModel, ModelResolutionError } from './resolver.js';
26
+ export type { ResolveModelOptions, ResolvedChain, ResolutionDiagnostic, } from './resolver.js';
27
+ export { LocalExecutor, localExecutor } from './local-executor.js';
28
+ export type { LocalExecutorDeps, LocalExecutorInspection, } from './local-executor.js';
29
+ export { discoverAvailability } from './discovery.js';
30
+ export type { DiscoveryAdapter, DiscoveryDeps, DiscoveryOptions, } from './discovery.js';
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,EACvB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,SAAS,EACT,aAAa,EACb,YAAY,EACZ,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EACV,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * `@esankhan3/anvil-agent-core/router` — barrel.
3
+ *
4
+ * Public surface for the LLM router subsystem. See
5
+ * `AGENT-CORE-LLM-ROUTER-PLAN.md` for the phased rollout.
6
+ */
7
+ export { ALL_ERROR_CLASSES } from './types.js';
8
+ export { LlmRouter } from './router.js';
9
+ export { RouterError, classifyError, parseRetryAfterMs } from './errors.js';
10
+ export { runWithRetry, DEFAULT_RETRY_POLICY } from './retry.js';
11
+ export { TokenBucketRateLimiter, RateLimitedError, DEFAULT_RATE_LIMITS, } from './rate-limiter.js';
12
+ export { SpendLedger, SPEND_LEDGER_SCHEMA_SQL, defaultSpendLedgerPath, } from './spend-ledger.js';
13
+ export { CircuitBreaker, DEFAULT_CIRCUIT_BREAKER } from './circuit-breaker.js';
14
+ export { loadRouterConfig, findRouterConfigPath, defaultRouterConfig, mergeWithDefaults, } from './config-loader.js';
15
+ export { invokeWithSpans, ROUTER_INVOKE_SPAN, ROUTER_ATTEMPT_SPAN, RouterAttr, } from './telemetry.js';
16
+ export { loadModelRegistry, parseModelRegistry, findModelsConfigPath, DEFAULT_WALKER_CONFIG, ModelRegistryParseError, ModelRegistryValidationError, } from './model-registry.js';
17
+ export { resolveModel, ModelResolutionError } from './resolver.js';
18
+ export { LocalExecutor, localExecutor } from './local-executor.js';
19
+ export { discoverAvailability } from './discovery.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAY7B,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAMnE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * LocalExecutor — process-local FIFO single-slot queue for exclusive
3
+ * local models (Ollama big-model slots that can't co-reside on a 16GB
4
+ * GPU). Embedding + reranker models bypass this entirely.
5
+ *
6
+ * Contract:
7
+ * • At most ONE exclusive model is loaded at a time.
8
+ * • Concurrent callers are serialized in FIFO order — no deadlock,
9
+ * no priority inversion.
10
+ * • Switching from model A → model B triggers a synchronous eviction
11
+ * of A via Ollama's `POST /api/generate {model: A, prompt: '',
12
+ * keep_alive: 0}`, then polls `/api/ps` until A is no longer
13
+ * resident before letting B's call go through. Confirmed eviction
14
+ * prevents the GPU from briefly holding both.
15
+ * • Before every load, the executor probes `/api/ps` for OUT-OF-BAND
16
+ * resident exclusive models (e.g. an Ollama CLI session on the
17
+ * host loaded one independently). Intruders are evicted before B
18
+ * loads, so no two exclusive models are ever resident at once.
19
+ * • If `fn` throws, the slot is released and the queue keeps moving.
20
+ * • Same-id consecutive calls do NOT trigger eviction.
21
+ */
22
+ export interface LocalExecutorDeps {
23
+ /** Override the eviction call (used by tests; defaults to `fetch` to Ollama). */
24
+ evict?: (modelId: string) => Promise<void>;
25
+ /** Returns the model ids Ollama currently has resident. Tests inject
26
+ * to assert intruder-detection. Default = hits /api/ps. */
27
+ probeResident?: () => Promise<string[]>;
28
+ /** Returns true when modelId is an exclusive-slot model (i.e. should
29
+ * NOT co-reside with another exclusive model). Default returns true
30
+ * for every input — the legacy executor cared only about its own
31
+ * internal `loaded`. New callers can wire it to the model registry
32
+ * for correct intruder filtering. */
33
+ isExclusive?: (modelId: string) => boolean;
34
+ /** Override now() for deterministic tests. */
35
+ now?: () => number;
36
+ }
37
+ export interface LocalExecutorInspection {
38
+ loaded: string | null;
39
+ queueDepth: number;
40
+ }
41
+ export declare class LocalExecutor {
42
+ private loaded;
43
+ private queue;
44
+ private busy;
45
+ private readonly deps;
46
+ constructor(deps?: LocalExecutorDeps);
47
+ withModel<T>(modelId: string, fn: () => Promise<T>): Promise<T>;
48
+ inspect(): LocalExecutorInspection;
49
+ private pump;
50
+ }
51
+ /**
52
+ * Process-local singleton. Modules that wrap exclusive-slot calls
53
+ * import this directly; tests construct their own instance to avoid
54
+ * cross-test pollution.
55
+ *
56
+ * The singleton is wired with the real Ollama probe so production
57
+ * intruder-detection works; per-test instances default to a no-op
58
+ * probe so they don't pay for a network round-trip they don't care
59
+ * about.
60
+ */
61
+ export declare const localExecutor: LocalExecutor;
62
+ //# sourceMappingURL=local-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-executor.d.ts","sourceRoot":"","sources":["../../src/router/local-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C;gEAC4D;IAC5D,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC;;;;0CAIsC;IACtC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;gBAEvC,IAAI,GAAE,iBAAsB;IAaxC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAY/D,OAAO,IAAI,uBAAuB;YAIpB,IAAI;CAwCnB;AAwDD;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,eAExB,CAAC"}