@esankhan3/anvil-agent-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/README.md +142 -0
  2. package/dist/__tests__/adapter-enrichment.test.d.ts +12 -0
  3. package/dist/__tests__/adapter-enrichment.test.d.ts.map +1 -0
  4. package/dist/__tests__/adapter-enrichment.test.js +199 -0
  5. package/dist/__tests__/adapter-enrichment.test.js.map +1 -0
  6. package/dist/__tests__/adk-anthropic-llm.test.d.ts +18 -0
  7. package/dist/__tests__/adk-anthropic-llm.test.d.ts.map +1 -0
  8. package/dist/__tests__/adk-anthropic-llm.test.js +124 -0
  9. package/dist/__tests__/adk-anthropic-llm.test.js.map +1 -0
  10. package/dist/__tests__/cost-breakdown.test.d.ts +11 -0
  11. package/dist/__tests__/cost-breakdown.test.d.ts.map +1 -0
  12. package/dist/__tests__/cost-breakdown.test.js +163 -0
  13. package/dist/__tests__/cost-breakdown.test.js.map +1 -0
  14. package/dist/__tests__/mcp.test.d.ts +13 -0
  15. package/dist/__tests__/mcp.test.d.ts.map +1 -0
  16. package/dist/__tests__/mcp.test.js +413 -0
  17. package/dist/__tests__/mcp.test.js.map +1 -0
  18. package/dist/__tests__/ollama-adapter-agentic.test.d.ts +15 -0
  19. package/dist/__tests__/ollama-adapter-agentic.test.d.ts.map +1 -0
  20. package/dist/__tests__/ollama-adapter-agentic.test.js +268 -0
  21. package/dist/__tests__/ollama-adapter-agentic.test.js.map +1 -0
  22. package/dist/__tests__/ollama-adapter-executor.test.d.ts +10 -0
  23. package/dist/__tests__/ollama-adapter-executor.test.d.ts.map +1 -0
  24. package/dist/__tests__/ollama-adapter-executor.test.js +95 -0
  25. package/dist/__tests__/ollama-adapter-executor.test.js.map +1 -0
  26. package/dist/__tests__/openai-adapter-output.test.d.ts +17 -0
  27. package/dist/__tests__/openai-adapter-output.test.d.ts.map +1 -0
  28. package/dist/__tests__/openai-adapter-output.test.js +127 -0
  29. package/dist/__tests__/openai-adapter-output.test.js.map +1 -0
  30. package/dist/__tests__/opencode-adapter.test.d.ts +7 -0
  31. package/dist/__tests__/opencode-adapter.test.d.ts.map +1 -0
  32. package/dist/__tests__/opencode-adapter.test.js +141 -0
  33. package/dist/__tests__/opencode-adapter.test.js.map +1 -0
  34. package/dist/__tests__/openrouter-adapter-agentic.test.d.ts +11 -0
  35. package/dist/__tests__/openrouter-adapter-agentic.test.d.ts.map +1 -0
  36. package/dist/__tests__/openrouter-adapter-agentic.test.js +297 -0
  37. package/dist/__tests__/openrouter-adapter-agentic.test.js.map +1 -0
  38. package/dist/__tests__/router-circuit-breaker.test.d.ts +6 -0
  39. package/dist/__tests__/router-circuit-breaker.test.d.ts.map +1 -0
  40. package/dist/__tests__/router-circuit-breaker.test.js +253 -0
  41. package/dist/__tests__/router-circuit-breaker.test.js.map +1 -0
  42. package/dist/__tests__/router-config-loader.test.d.ts +8 -0
  43. package/dist/__tests__/router-config-loader.test.d.ts.map +1 -0
  44. package/dist/__tests__/router-config-loader.test.js +172 -0
  45. package/dist/__tests__/router-config-loader.test.js.map +1 -0
  46. package/dist/__tests__/router-discovery.test.d.ts +5 -0
  47. package/dist/__tests__/router-discovery.test.d.ts.map +1 -0
  48. package/dist/__tests__/router-discovery.test.js +129 -0
  49. package/dist/__tests__/router-discovery.test.js.map +1 -0
  50. package/dist/__tests__/router-fallback.test.d.ts +9 -0
  51. package/dist/__tests__/router-fallback.test.d.ts.map +1 -0
  52. package/dist/__tests__/router-fallback.test.js +283 -0
  53. package/dist/__tests__/router-fallback.test.js.map +1 -0
  54. package/dist/__tests__/router-local-executor.test.d.ts +6 -0
  55. package/dist/__tests__/router-local-executor.test.d.ts.map +1 -0
  56. package/dist/__tests__/router-local-executor.test.js +193 -0
  57. package/dist/__tests__/router-local-executor.test.js.map +1 -0
  58. package/dist/__tests__/router-model-registry.test.d.ts +8 -0
  59. package/dist/__tests__/router-model-registry.test.d.ts.map +1 -0
  60. package/dist/__tests__/router-model-registry.test.js +389 -0
  61. package/dist/__tests__/router-model-registry.test.js.map +1 -0
  62. package/dist/__tests__/router-rate-limiter.test.d.ts +8 -0
  63. package/dist/__tests__/router-rate-limiter.test.d.ts.map +1 -0
  64. package/dist/__tests__/router-rate-limiter.test.js +128 -0
  65. package/dist/__tests__/router-rate-limiter.test.js.map +1 -0
  66. package/dist/__tests__/router-resolver.test.d.ts +7 -0
  67. package/dist/__tests__/router-resolver.test.d.ts.map +1 -0
  68. package/dist/__tests__/router-resolver.test.js +110 -0
  69. package/dist/__tests__/router-resolver.test.js.map +1 -0
  70. package/dist/__tests__/router-retry.test.d.ts +7 -0
  71. package/dist/__tests__/router-retry.test.d.ts.map +1 -0
  72. package/dist/__tests__/router-retry.test.js +302 -0
  73. package/dist/__tests__/router-retry.test.js.map +1 -0
  74. package/dist/__tests__/router-scaffold.test.d.ts +11 -0
  75. package/dist/__tests__/router-scaffold.test.d.ts.map +1 -0
  76. package/dist/__tests__/router-scaffold.test.js +103 -0
  77. package/dist/__tests__/router-scaffold.test.js.map +1 -0
  78. package/dist/__tests__/router-spend-ledger.test.d.ts +8 -0
  79. package/dist/__tests__/router-spend-ledger.test.d.ts.map +1 -0
  80. package/dist/__tests__/router-spend-ledger.test.js +227 -0
  81. package/dist/__tests__/router-spend-ledger.test.js.map +1 -0
  82. package/dist/__tests__/router-telemetry.test.d.ts +11 -0
  83. package/dist/__tests__/router-telemetry.test.d.ts.map +1 -0
  84. package/dist/__tests__/router-telemetry.test.js +173 -0
  85. package/dist/__tests__/router-telemetry.test.js.map +1 -0
  86. package/dist/__tests__/single-shot.test.d.ts +12 -0
  87. package/dist/__tests__/single-shot.test.d.ts.map +1 -0
  88. package/dist/__tests__/single-shot.test.js +204 -0
  89. package/dist/__tests__/single-shot.test.js.map +1 -0
  90. package/dist/__tests__/skills-prompt.test.d.ts +11 -0
  91. package/dist/__tests__/skills-prompt.test.d.ts.map +1 -0
  92. package/dist/__tests__/skills-prompt.test.js +208 -0
  93. package/dist/__tests__/skills-prompt.test.js.map +1 -0
  94. package/dist/__tests__/skills.test.d.ts +11 -0
  95. package/dist/__tests__/skills.test.d.ts.map +1 -0
  96. package/dist/__tests__/skills.test.js +161 -0
  97. package/dist/__tests__/skills.test.js.map +1 -0
  98. package/dist/__tests__/telemetry-integration.test.d.ts +12 -0
  99. package/dist/__tests__/telemetry-integration.test.d.ts.map +1 -0
  100. package/dist/__tests__/telemetry-integration.test.js +153 -0
  101. package/dist/__tests__/telemetry-integration.test.js.map +1 -0
  102. package/dist/__tests__/telemetry.test.d.ts +13 -0
  103. package/dist/__tests__/telemetry.test.d.ts.map +1 -0
  104. package/dist/__tests__/telemetry.test.js +161 -0
  105. package/dist/__tests__/telemetry.test.js.map +1 -0
  106. package/dist/__tests__/upstream-error.test.d.ts +8 -0
  107. package/dist/__tests__/upstream-error.test.d.ts.map +1 -0
  108. package/dist/__tests__/upstream-error.test.js +186 -0
  109. package/dist/__tests__/upstream-error.test.js.map +1 -0
  110. package/dist/adk-adapter.d.ts +45 -0
  111. package/dist/adk-adapter.d.ts.map +1 -0
  112. package/dist/adk-adapter.js +403 -0
  113. package/dist/adk-adapter.js.map +1 -0
  114. package/dist/adk-anthropic-llm.d.ts +59 -0
  115. package/dist/adk-anthropic-llm.d.ts.map +1 -0
  116. package/dist/adk-anthropic-llm.js +397 -0
  117. package/dist/adk-anthropic-llm.js.map +1 -0
  118. package/dist/agent/index.d.ts +14 -0
  119. package/dist/agent/index.d.ts.map +1 -0
  120. package/dist/agent/index.js +14 -0
  121. package/dist/agent/index.js.map +1 -0
  122. package/dist/agent/session/__tests__/bridge-tool-executor.test.d.ts +10 -0
  123. package/dist/agent/session/__tests__/bridge-tool-executor.test.d.ts.map +1 -0
  124. package/dist/agent/session/__tests__/bridge-tool-executor.test.js +152 -0
  125. package/dist/agent/session/__tests__/bridge-tool-executor.test.js.map +1 -0
  126. package/dist/agent/session/__tests__/collect-trajectory.test.d.ts +18 -0
  127. package/dist/agent/session/__tests__/collect-trajectory.test.d.ts.map +1 -0
  128. package/dist/agent/session/__tests__/collect-trajectory.test.js +208 -0
  129. package/dist/agent/session/__tests__/collect-trajectory.test.js.map +1 -0
  130. package/dist/agent/session/__tests__/run-with-agent.test.d.ts +8 -0
  131. package/dist/agent/session/__tests__/run-with-agent.test.d.ts.map +1 -0
  132. package/dist/agent/session/__tests__/run-with-agent.test.js +98 -0
  133. package/dist/agent/session/__tests__/run-with-agent.test.js.map +1 -0
  134. package/dist/agent/session/__tests__/runtime.test.d.ts +7 -0
  135. package/dist/agent/session/__tests__/runtime.test.d.ts.map +1 -0
  136. package/dist/agent/session/__tests__/runtime.test.js +361 -0
  137. package/dist/agent/session/__tests__/runtime.test.js.map +1 -0
  138. package/dist/agent/session/__tests__/skills-mcp-spawn.test.d.ts +15 -0
  139. package/dist/agent/session/__tests__/skills-mcp-spawn.test.d.ts.map +1 -0
  140. package/dist/agent/session/__tests__/skills-mcp-spawn.test.js +160 -0
  141. package/dist/agent/session/__tests__/skills-mcp-spawn.test.js.map +1 -0
  142. package/dist/agent/session/__tests__/spawn-telemetry.test.d.ts +13 -0
  143. package/dist/agent/session/__tests__/spawn-telemetry.test.d.ts.map +1 -0
  144. package/dist/agent/session/__tests__/spawn-telemetry.test.js +135 -0
  145. package/dist/agent/session/__tests__/spawn-telemetry.test.js.map +1 -0
  146. package/dist/agent/session/__tests__/types.test.d.ts +9 -0
  147. package/dist/agent/session/__tests__/types.test.d.ts.map +1 -0
  148. package/dist/agent/session/__tests__/types.test.js +220 -0
  149. package/dist/agent/session/__tests__/types.test.js.map +1 -0
  150. package/dist/agent/session/adapter.d.ts +108 -0
  151. package/dist/agent/session/adapter.d.ts.map +1 -0
  152. package/dist/agent/session/adapter.js +39 -0
  153. package/dist/agent/session/adapter.js.map +1 -0
  154. package/dist/agent/session/collect-trajectory.d.ts +36 -0
  155. package/dist/agent/session/collect-trajectory.d.ts.map +1 -0
  156. package/dist/agent/session/collect-trajectory.js +193 -0
  157. package/dist/agent/session/collect-trajectory.js.map +1 -0
  158. package/dist/agent/session/default-adapter-factory.d.ts +48 -0
  159. package/dist/agent/session/default-adapter-factory.d.ts.map +1 -0
  160. package/dist/agent/session/default-adapter-factory.js +227 -0
  161. package/dist/agent/session/default-adapter-factory.js.map +1 -0
  162. package/dist/agent/session/headless-types.d.ts +85 -0
  163. package/dist/agent/session/headless-types.d.ts.map +1 -0
  164. package/dist/agent/session/headless-types.js +16 -0
  165. package/dist/agent/session/headless-types.js.map +1 -0
  166. package/dist/agent/session/index.d.ts +18 -0
  167. package/dist/agent/session/index.d.ts.map +1 -0
  168. package/dist/agent/session/index.js +20 -0
  169. package/dist/agent/session/index.js.map +1 -0
  170. package/dist/agent/session/language-model-bridge.d.ts +84 -0
  171. package/dist/agent/session/language-model-bridge.d.ts.map +1 -0
  172. package/dist/agent/session/language-model-bridge.js +454 -0
  173. package/dist/agent/session/language-model-bridge.js.map +1 -0
  174. package/dist/agent/session/legacy-adapter-types.d.ts +63 -0
  175. package/dist/agent/session/legacy-adapter-types.d.ts.map +1 -0
  176. package/dist/agent/session/legacy-adapter-types.js +11 -0
  177. package/dist/agent/session/legacy-adapter-types.js.map +1 -0
  178. package/dist/agent/session/run-with-agent.d.ts +36 -0
  179. package/dist/agent/session/run-with-agent.d.ts.map +1 -0
  180. package/dist/agent/session/run-with-agent.js +81 -0
  181. package/dist/agent/session/run-with-agent.js.map +1 -0
  182. package/dist/agent/session/session-registry.d.ts +71 -0
  183. package/dist/agent/session/session-registry.d.ts.map +1 -0
  184. package/dist/agent/session/session-registry.js +209 -0
  185. package/dist/agent/session/session-registry.js.map +1 -0
  186. package/dist/agent/session/session.d.ts +76 -0
  187. package/dist/agent/session/session.d.ts.map +1 -0
  188. package/dist/agent/session/session.js +327 -0
  189. package/dist/agent/session/session.js.map +1 -0
  190. package/dist/agent/session/types.d.ts +230 -0
  191. package/dist/agent/session/types.d.ts.map +1 -0
  192. package/dist/agent/session/types.js +44 -0
  193. package/dist/agent/session/types.js.map +1 -0
  194. package/dist/checkpoint/__tests__/blob-store.test.d.ts +5 -0
  195. package/dist/checkpoint/__tests__/blob-store.test.d.ts.map +1 -0
  196. package/dist/checkpoint/__tests__/blob-store.test.js +82 -0
  197. package/dist/checkpoint/__tests__/blob-store.test.js.map +1 -0
  198. package/dist/checkpoint/__tests__/key.test.d.ts +7 -0
  199. package/dist/checkpoint/__tests__/key.test.d.ts.map +1 -0
  200. package/dist/checkpoint/__tests__/key.test.js +130 -0
  201. package/dist/checkpoint/__tests__/key.test.js.map +1 -0
  202. package/dist/checkpoint/__tests__/runner.test.d.ts +12 -0
  203. package/dist/checkpoint/__tests__/runner.test.d.ts.map +1 -0
  204. package/dist/checkpoint/__tests__/runner.test.js +201 -0
  205. package/dist/checkpoint/__tests__/runner.test.js.map +1 -0
  206. package/dist/checkpoint/__tests__/store.test.d.ts +6 -0
  207. package/dist/checkpoint/__tests__/store.test.d.ts.map +1 -0
  208. package/dist/checkpoint/__tests__/store.test.js +150 -0
  209. package/dist/checkpoint/__tests__/store.test.js.map +1 -0
  210. package/dist/checkpoint/blob-store.d.ts +41 -0
  211. package/dist/checkpoint/blob-store.d.ts.map +1 -0
  212. package/dist/checkpoint/blob-store.js +119 -0
  213. package/dist/checkpoint/blob-store.js.map +1 -0
  214. package/dist/checkpoint/index.d.ts +15 -0
  215. package/dist/checkpoint/index.d.ts.map +1 -0
  216. package/dist/checkpoint/index.js +14 -0
  217. package/dist/checkpoint/index.js.map +1 -0
  218. package/dist/checkpoint/key.d.ts +39 -0
  219. package/dist/checkpoint/key.d.ts.map +1 -0
  220. package/dist/checkpoint/key.js +112 -0
  221. package/dist/checkpoint/key.js.map +1 -0
  222. package/dist/checkpoint/runner.d.ts +83 -0
  223. package/dist/checkpoint/runner.d.ts.map +1 -0
  224. package/dist/checkpoint/runner.js +146 -0
  225. package/dist/checkpoint/runner.js.map +1 -0
  226. package/dist/checkpoint/store.d.ts +91 -0
  227. package/dist/checkpoint/store.d.ts.map +1 -0
  228. package/dist/checkpoint/store.js +292 -0
  229. package/dist/checkpoint/store.js.map +1 -0
  230. package/dist/checkpoint/types.d.ts +74 -0
  231. package/dist/checkpoint/types.d.ts.map +1 -0
  232. package/dist/checkpoint/types.js +16 -0
  233. package/dist/checkpoint/types.js.map +1 -0
  234. package/dist/claude-adapter.d.ts +23 -0
  235. package/dist/claude-adapter.d.ts.map +1 -0
  236. package/dist/claude-adapter.js +233 -0
  237. package/dist/claude-adapter.js.map +1 -0
  238. package/dist/cost.d.ts +67 -0
  239. package/dist/cost.d.ts.map +1 -0
  240. package/dist/cost.js +148 -0
  241. package/dist/cost.js.map +1 -0
  242. package/dist/data/model-prices.json +39681 -0
  243. package/dist/fallback-adapter.d.ts +51 -0
  244. package/dist/fallback-adapter.d.ts.map +1 -0
  245. package/dist/fallback-adapter.js +116 -0
  246. package/dist/fallback-adapter.js.map +1 -0
  247. package/dist/gemini-adapter.d.ts +22 -0
  248. package/dist/gemini-adapter.d.ts.map +1 -0
  249. package/dist/gemini-adapter.js +185 -0
  250. package/dist/gemini-adapter.js.map +1 -0
  251. package/dist/gemini-cli-adapter.d.ts +24 -0
  252. package/dist/gemini-cli-adapter.d.ts.map +1 -0
  253. package/dist/gemini-cli-adapter.js +169 -0
  254. package/dist/gemini-cli-adapter.js.map +1 -0
  255. package/dist/index.d.ts +39 -0
  256. package/dist/index.d.ts.map +1 -0
  257. package/dist/index.js +39 -0
  258. package/dist/index.js.map +1 -0
  259. package/dist/mcp/client.d.ts +32 -0
  260. package/dist/mcp/client.d.ts.map +1 -0
  261. package/dist/mcp/client.js +92 -0
  262. package/dist/mcp/client.js.map +1 -0
  263. package/dist/mcp/config-loader.d.ts +36 -0
  264. package/dist/mcp/config-loader.d.ts.map +1 -0
  265. package/dist/mcp/config-loader.js +129 -0
  266. package/dist/mcp/config-loader.js.map +1 -0
  267. package/dist/mcp/index.d.ts +12 -0
  268. package/dist/mcp/index.d.ts.map +1 -0
  269. package/dist/mcp/index.js +11 -0
  270. package/dist/mcp/index.js.map +1 -0
  271. package/dist/mcp/tool-merger.d.ts +18 -0
  272. package/dist/mcp/tool-merger.d.ts.map +1 -0
  273. package/dist/mcp/tool-merger.js +34 -0
  274. package/dist/mcp/tool-merger.js.map +1 -0
  275. package/dist/mcp/types.d.ts +35 -0
  276. package/dist/mcp/types.d.ts.map +1 -0
  277. package/dist/mcp/types.js +10 -0
  278. package/dist/mcp/types.js.map +1 -0
  279. package/dist/ollama-adapter.d.ts +95 -0
  280. package/dist/ollama-adapter.d.ts.map +1 -0
  281. package/dist/ollama-adapter.js +404 -0
  282. package/dist/ollama-adapter.js.map +1 -0
  283. package/dist/openai-adapter.d.ts +40 -0
  284. package/dist/openai-adapter.d.ts.map +1 -0
  285. package/dist/openai-adapter.js +81 -0
  286. package/dist/openai-adapter.js.map +1 -0
  287. package/dist/opencode-adapter.d.ts +39 -0
  288. package/dist/opencode-adapter.d.ts.map +1 -0
  289. package/dist/opencode-adapter.js +105 -0
  290. package/dist/opencode-adapter.js.map +1 -0
  291. package/dist/openrouter-adapter.d.ts +69 -0
  292. package/dist/openrouter-adapter.d.ts.map +1 -0
  293. package/dist/openrouter-adapter.js +481 -0
  294. package/dist/openrouter-adapter.js.map +1 -0
  295. package/dist/registry.d.ts +55 -0
  296. package/dist/registry.d.ts.map +1 -0
  297. package/dist/registry.js +191 -0
  298. package/dist/registry.js.map +1 -0
  299. package/dist/router/circuit-breaker.d.ts +57 -0
  300. package/dist/router/circuit-breaker.d.ts.map +1 -0
  301. package/dist/router/circuit-breaker.js +110 -0
  302. package/dist/router/circuit-breaker.js.map +1 -0
  303. package/dist/router/config-loader.d.ts +43 -0
  304. package/dist/router/config-loader.d.ts.map +1 -0
  305. package/dist/router/config-loader.js +155 -0
  306. package/dist/router/config-loader.js.map +1 -0
  307. package/dist/router/discovery.d.ts +37 -0
  308. package/dist/router/discovery.d.ts.map +1 -0
  309. package/dist/router/discovery.js +54 -0
  310. package/dist/router/discovery.js.map +1 -0
  311. package/dist/router/errors.d.ts +39 -0
  312. package/dist/router/errors.d.ts.map +1 -0
  313. package/dist/router/errors.js +103 -0
  314. package/dist/router/errors.js.map +1 -0
  315. package/dist/router/index.d.ts +31 -0
  316. package/dist/router/index.d.ts.map +1 -0
  317. package/dist/router/index.js +20 -0
  318. package/dist/router/index.js.map +1 -0
  319. package/dist/router/local-executor.d.ts +62 -0
  320. package/dist/router/local-executor.d.ts.map +1 -0
  321. package/dist/router/local-executor.js +161 -0
  322. package/dist/router/local-executor.js.map +1 -0
  323. package/dist/router/model-registry.d.ts +90 -0
  324. package/dist/router/model-registry.d.ts.map +1 -0
  325. package/dist/router/model-registry.js +242 -0
  326. package/dist/router/model-registry.js.map +1 -0
  327. package/dist/router/rate-limiter.d.ts +63 -0
  328. package/dist/router/rate-limiter.d.ts.map +1 -0
  329. package/dist/router/rate-limiter.js +136 -0
  330. package/dist/router/rate-limiter.js.map +1 -0
  331. package/dist/router/resolver.d.ts +45 -0
  332. package/dist/router/resolver.d.ts.map +1 -0
  333. package/dist/router/resolver.js +71 -0
  334. package/dist/router/resolver.js.map +1 -0
  335. package/dist/router/retry.d.ts +58 -0
  336. package/dist/router/retry.d.ts.map +1 -0
  337. package/dist/router/retry.js +119 -0
  338. package/dist/router/retry.js.map +1 -0
  339. package/dist/router/router.d.ts +100 -0
  340. package/dist/router/router.d.ts.map +1 -0
  341. package/dist/router/router.js +306 -0
  342. package/dist/router/router.js.map +1 -0
  343. package/dist/router/spend-ledger.d.ts +69 -0
  344. package/dist/router/spend-ledger.d.ts.map +1 -0
  345. package/dist/router/spend-ledger.js +191 -0
  346. package/dist/router/spend-ledger.js.map +1 -0
  347. package/dist/router/telemetry.d.ts +48 -0
  348. package/dist/router/telemetry.d.ts.map +1 -0
  349. package/dist/router/telemetry.js +112 -0
  350. package/dist/router/telemetry.js.map +1 -0
  351. package/dist/router/types.d.ts +95 -0
  352. package/dist/router/types.d.ts.map +1 -0
  353. package/dist/router/types.js +16 -0
  354. package/dist/router/types.js.map +1 -0
  355. package/dist/single-shot.d.ts +60 -0
  356. package/dist/single-shot.d.ts.map +1 -0
  357. package/dist/single-shot.js +385 -0
  358. package/dist/single-shot.js.map +1 -0
  359. package/dist/skills/activator.d.ts +17 -0
  360. package/dist/skills/activator.d.ts.map +1 -0
  361. package/dist/skills/activator.js +24 -0
  362. package/dist/skills/activator.js.map +1 -0
  363. package/dist/skills/compose.d.ts +43 -0
  364. package/dist/skills/compose.d.ts.map +1 -0
  365. package/dist/skills/compose.js +53 -0
  366. package/dist/skills/compose.js.map +1 -0
  367. package/dist/skills/index.d.ts +17 -0
  368. package/dist/skills/index.d.ts.map +1 -0
  369. package/dist/skills/index.js +16 -0
  370. package/dist/skills/index.js.map +1 -0
  371. package/dist/skills/loader.d.ts +9 -0
  372. package/dist/skills/loader.d.ts.map +1 -0
  373. package/dist/skills/loader.js +49 -0
  374. package/dist/skills/loader.js.map +1 -0
  375. package/dist/skills/parser.d.ts +13 -0
  376. package/dist/skills/parser.d.ts.map +1 -0
  377. package/dist/skills/parser.js +60 -0
  378. package/dist/skills/parser.js.map +1 -0
  379. package/dist/skills/render.d.ts +11 -0
  380. package/dist/skills/render.d.ts.map +1 -0
  381. package/dist/skills/render.js +21 -0
  382. package/dist/skills/render.js.map +1 -0
  383. package/dist/skills/resolve-dir.d.ts +20 -0
  384. package/dist/skills/resolve-dir.d.ts.map +1 -0
  385. package/dist/skills/resolve-dir.js +30 -0
  386. package/dist/skills/resolve-dir.js.map +1 -0
  387. package/dist/skills/tool-policy.d.ts +26 -0
  388. package/dist/skills/tool-policy.d.ts.map +1 -0
  389. package/dist/skills/tool-policy.js +33 -0
  390. package/dist/skills/tool-policy.js.map +1 -0
  391. package/dist/skills/types.d.ts +42 -0
  392. package/dist/skills/types.d.ts.map +1 -0
  393. package/dist/skills/types.js +8 -0
  394. package/dist/skills/types.js.map +1 -0
  395. package/dist/stream-format.d.ts +100 -0
  396. package/dist/stream-format.d.ts.map +1 -0
  397. package/dist/stream-format.js +90 -0
  398. package/dist/stream-format.js.map +1 -0
  399. package/dist/telemetry/attributes.d.ts +38 -0
  400. package/dist/telemetry/attributes.d.ts.map +1 -0
  401. package/dist/telemetry/attributes.js +39 -0
  402. package/dist/telemetry/attributes.js.map +1 -0
  403. package/dist/telemetry/config.d.ts +30 -0
  404. package/dist/telemetry/config.d.ts.map +1 -0
  405. package/dist/telemetry/config.js +54 -0
  406. package/dist/telemetry/config.js.map +1 -0
  407. package/dist/telemetry/exporters.d.ts +10 -0
  408. package/dist/telemetry/exporters.d.ts.map +1 -0
  409. package/dist/telemetry/exporters.js +46 -0
  410. package/dist/telemetry/exporters.js.map +1 -0
  411. package/dist/telemetry/index.d.ts +15 -0
  412. package/dist/telemetry/index.d.ts.map +1 -0
  413. package/dist/telemetry/index.js +12 -0
  414. package/dist/telemetry/index.js.map +1 -0
  415. package/dist/telemetry/instrument.d.ts +36 -0
  416. package/dist/telemetry/instrument.d.ts.map +1 -0
  417. package/dist/telemetry/instrument.js +215 -0
  418. package/dist/telemetry/instrument.js.map +1 -0
  419. package/dist/telemetry/metrics.d.ts +45 -0
  420. package/dist/telemetry/metrics.d.ts.map +1 -0
  421. package/dist/telemetry/metrics.js +186 -0
  422. package/dist/telemetry/metrics.js.map +1 -0
  423. package/dist/telemetry/tracer.d.ts +33 -0
  424. package/dist/telemetry/tracer.d.ts.map +1 -0
  425. package/dist/telemetry/tracer.js +162 -0
  426. package/dist/telemetry/tracer.js.map +1 -0
  427. package/dist/tools/__tests__/builtin.test.d.ts +7 -0
  428. package/dist/tools/__tests__/builtin.test.d.ts.map +1 -0
  429. package/dist/tools/__tests__/builtin.test.js +242 -0
  430. package/dist/tools/__tests__/builtin.test.js.map +1 -0
  431. package/dist/tools/builtin.d.ts +29 -0
  432. package/dist/tools/builtin.d.ts.map +1 -0
  433. package/dist/tools/builtin.js +367 -0
  434. package/dist/tools/builtin.js.map +1 -0
  435. package/dist/tools/index.d.ts +4 -0
  436. package/dist/tools/index.d.ts.map +1 -0
  437. package/dist/tools/index.js +3 -0
  438. package/dist/tools/index.js.map +1 -0
  439. package/dist/tools/path-guard.d.ts +23 -0
  440. package/dist/tools/path-guard.d.ts.map +1 -0
  441. package/dist/tools/path-guard.js +66 -0
  442. package/dist/tools/path-guard.js.map +1 -0
  443. package/dist/tools/types.d.ts +45 -0
  444. package/dist/tools/types.d.ts.map +1 -0
  445. package/dist/tools/types.js +11 -0
  446. package/dist/tools/types.js.map +1 -0
  447. package/dist/types.d.ts +249 -0
  448. package/dist/types.d.ts.map +1 -0
  449. package/dist/types.js +22 -0
  450. package/dist/types.js.map +1 -0
  451. package/dist/upstream-error.d.ts +64 -0
  452. package/dist/upstream-error.d.ts.map +1 -0
  453. package/dist/upstream-error.js +105 -0
  454. package/dist/upstream-error.js.map +1 -0
  455. package/dist/version.d.ts +2 -0
  456. package/dist/version.d.ts.map +1 -0
  457. package/dist/version.js +2 -0
  458. package/dist/version.js.map +1 -0
  459. package/package.json +49 -0
package/dist/index.js ADDED
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @esankhan3/anvil-agent-core — public barrel.
3
+ *
4
+ * What lives here today (Phase 1):
5
+ * - Shared LLM types: `LanguageModel`, `ModelAdapter`, `ProviderName`,
6
+ * `ProviderTier`, `StreamEvent`, `InvokeResult`, etc.
7
+ * - VERSION constant.
8
+ *
9
+ * What will land in subsequent phases:
10
+ * - Phase 2: stream-format types (NDJSON event shapes)
11
+ * - Phase 3: ProviderRegistry singleton
12
+ * - Phase 4: 7 provider adapters
13
+ * - Phase 5: single-shot wrapper (runLLM / runClaude / runGemini)
14
+ * - Phase 6: agent subprocess machinery (AgentManager, spawn, etc.)
15
+ * - Phase 7: cost table loader
16
+ */
17
+ export * from './types.js';
18
+ export * from './stream-format.js';
19
+ export * from './registry.js';
20
+ export { ClaudeAdapter } from './claude-adapter.js';
21
+ export { OpenAIAdapter } from './openai-adapter.js';
22
+ export { GeminiAdapter } from './gemini-adapter.js';
23
+ export { OpenRouterAdapter } from './openrouter-adapter.js';
24
+ export { OllamaAdapter } from './ollama-adapter.js';
25
+ export { GeminiCliAdapter } from './gemini-cli-adapter.js';
26
+ export { AdkAdapter } from './adk-adapter.js';
27
+ export { OpenCodeAdapter } from './opencode-adapter.js';
28
+ export { FallbackAdapter } from './fallback-adapter.js';
29
+ export * from './single-shot.js';
30
+ export * from './agent/index.js';
31
+ export * from './checkpoint/index.js';
32
+ export * from './cost.js';
33
+ export * from './telemetry/index.js';
34
+ export * from './skills/index.js';
35
+ export * from './mcp/index.js';
36
+ export * from './router/index.js';
37
+ export * from './tools/index.js';
38
+ export { VERSION } from './version.js';
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `McpAgentClient` — wraps the official MCP TypeScript SDK with the lifecycle
3
+ * Anvil's agent layer needs (lazy connect, tool listing with namespacing,
4
+ * tool dispatch, clean close).
5
+ *
6
+ * One instance per configured MCP server. The agent's tool-call loop owns
7
+ * close() so subprocesses don't leak between invocations.
8
+ */
9
+ import type { ToolSchema } from '../types.js';
10
+ import type { McpServerConfig } from './types.js';
11
+ export declare class McpAgentClient {
12
+ readonly config: McpServerConfig;
13
+ private client;
14
+ private connected;
15
+ constructor(config: McpServerConfig);
16
+ connect(): Promise<void>;
17
+ /**
18
+ * Returns the server's tools, namespaced as `<serverName>/<toolName>` so
19
+ * multiple MCP servers exposing identically-named tools don't collide in
20
+ * the agent's flat tool registry.
21
+ */
22
+ listTools(): Promise<ToolSchema[]>;
23
+ /**
24
+ * Dispatch a tool call. Accepts either the namespaced form
25
+ * (`<server>/<tool>`) or the bare tool name; strips the server prefix
26
+ * before forwarding to the SDK.
27
+ */
28
+ callTool(toolName: string, args: Record<string, unknown>): Promise<unknown>;
29
+ close(): Promise<void>;
30
+ isConnected(): boolean;
31
+ }
32
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKlD,qBAAa,cAAc;aAIG,MAAM,EAAE,eAAe;IAHnD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;gBAEE,MAAM,EAAE,eAAe;IAO7C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B9B;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAUxC;;;;OAIG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,WAAW,IAAI,OAAO;CAGvB"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * `McpAgentClient` — wraps the official MCP TypeScript SDK with the lifecycle
3
+ * Anvil's agent layer needs (lazy connect, tool listing with namespacing,
4
+ * tool dispatch, clean close).
5
+ *
6
+ * One instance per configured MCP server. The agent's tool-call loop owns
7
+ * close() so subprocesses don't leak between invocations.
8
+ */
9
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
10
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
11
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
12
+ import { VERSION } from '../version.js';
13
+ const CLIENT_NAME = 'anvil-agent';
14
+ export class McpAgentClient {
15
+ config;
16
+ client;
17
+ connected = false;
18
+ constructor(config) {
19
+ this.config = config;
20
+ this.client = new Client({ name: CLIENT_NAME, version: VERSION }, { capabilities: {} });
21
+ }
22
+ async connect() {
23
+ if (this.connected)
24
+ return;
25
+ if (this.config.transport === 'stdio') {
26
+ if (!this.config.command) {
27
+ throw new Error(`MCP server "${this.config.name}" has stdio transport but no command`);
28
+ }
29
+ const transport = new StdioClientTransport({
30
+ command: this.config.command,
31
+ args: this.config.args ?? [],
32
+ env: this.config.env,
33
+ });
34
+ await this.client.connect(transport);
35
+ }
36
+ else {
37
+ if (!this.config.url) {
38
+ throw new Error(`MCP server "${this.config.name}" has streamable-http transport but no url`);
39
+ }
40
+ const transport = new StreamableHTTPClientTransport(new URL(this.config.url), {
41
+ requestInit: { headers: this.config.headers },
42
+ });
43
+ await this.client.connect(transport);
44
+ }
45
+ this.connected = true;
46
+ }
47
+ /**
48
+ * Returns the server's tools, namespaced as `<serverName>/<toolName>` so
49
+ * multiple MCP servers exposing identically-named tools don't collide in
50
+ * the agent's flat tool registry.
51
+ */
52
+ async listTools() {
53
+ if (!this.connected)
54
+ await this.connect();
55
+ const result = await this.client.listTools();
56
+ return result.tools.map((t) => ({
57
+ name: `${this.config.name}/${t.name}`,
58
+ description: t.description ?? '',
59
+ inputSchema: t.inputSchema ?? {},
60
+ }));
61
+ }
62
+ /**
63
+ * Dispatch a tool call. Accepts either the namespaced form
64
+ * (`<server>/<tool>`) or the bare tool name; strips the server prefix
65
+ * before forwarding to the SDK.
66
+ */
67
+ async callTool(toolName, args) {
68
+ if (!this.connected)
69
+ await this.connect();
70
+ const prefix = `${this.config.name}/`;
71
+ const stripped = toolName.startsWith(prefix) ? toolName.slice(prefix.length) : toolName;
72
+ const result = await this.client.callTool({
73
+ name: stripped,
74
+ arguments: args,
75
+ });
76
+ return result;
77
+ }
78
+ async close() {
79
+ if (!this.connected)
80
+ return;
81
+ try {
82
+ await this.client.close();
83
+ }
84
+ finally {
85
+ this.connected = false;
86
+ }
87
+ }
88
+ isConnected() {
89
+ return this.connected;
90
+ }
91
+ }
92
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAGnG,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,OAAO,cAAc;IAIG;IAHpB,MAAM,CAAS;IACf,SAAS,GAAG,KAAK,CAAC;IAE1B,YAA4B,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;QACjD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CACtB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EACvC,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,CAAC,MAAM,CAAC,IAAI,sCAAsC,CACtE,CAAC;YACJ,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;gBACzC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;gBAC5B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;aACrB,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,CAAC,MAAM,CAAC,IAAI,4CAA4C,CAC5E,CAAC;YACJ,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBAC5E,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;aAC9C,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE;YACrC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,WAAW,EAAG,CAAC,CAAC,WAAuC,IAAI,EAAE;SAC9D,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,IAA6B;QAC5D,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * `mcp.json` discovery + parsing.
3
+ *
4
+ * Search order (locked in ADR §4.3):
5
+ * 1. process.env.ANVIL_MCP_CONFIG (full path)
6
+ * 2. <workspaceRoot>/mcp.json
7
+ * 3. <workspaceRoot>/.mcp/servers.json
8
+ * 4. <workspaceRoot>/.claude/mcp.json
9
+ * 5. $HOME/.claude/mcp.json
10
+ *
11
+ * The first existing file wins; configs do not merge.
12
+ *
13
+ * Each entry's transport is inferred from shape (`command` → stdio,
14
+ * `url` → streamable-http). Entries with both or neither are dropped with a
15
+ * stderr warning.
16
+ *
17
+ * `${env:VAR}` substitutions in env/headers values are expanded against
18
+ * `process.env` (or the provided env override).
19
+ */
20
+ import type { McpServerConfig } from './types.js';
21
+ export interface LoadMcpServersOptions {
22
+ /** Absolute workspace root used for ranks 2–4. */
23
+ workspaceRoot?: string;
24
+ /** Override `process.env`; supports both `ANVIL_MCP_CONFIG` and `${env:VAR}` substitution. */
25
+ env?: NodeJS.ProcessEnv;
26
+ /** Override `$HOME` (test seam). */
27
+ homeDir?: string;
28
+ }
29
+ /** Returns the path of the canonical `mcp.json` for the workspace, or undefined. */
30
+ export declare function findMcpConfigPath(opts?: LoadMcpServersOptions): string | undefined;
31
+ /**
32
+ * Read and parse the `mcp.json` for `workspaceRoot`. Returns `[]` when no
33
+ * config is found (graceful no-op for projects without MCP).
34
+ */
35
+ export declare function loadMcpServers(opts?: LoadMcpServersOptions): McpServerConfig[];
36
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/mcp/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8FAA8F;IAC9F,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,qBAA0B,GAAG,MAAM,GAAG,SAAS,CAmBtF;AAuDD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,qBAA0B,GAAG,eAAe,EAAE,CA+ClF"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * `mcp.json` discovery + parsing.
3
+ *
4
+ * Search order (locked in ADR §4.3):
5
+ * 1. process.env.ANVIL_MCP_CONFIG (full path)
6
+ * 2. <workspaceRoot>/mcp.json
7
+ * 3. <workspaceRoot>/.mcp/servers.json
8
+ * 4. <workspaceRoot>/.claude/mcp.json
9
+ * 5. $HOME/.claude/mcp.json
10
+ *
11
+ * The first existing file wins; configs do not merge.
12
+ *
13
+ * Each entry's transport is inferred from shape (`command` → stdio,
14
+ * `url` → streamable-http). Entries with both or neither are dropped with a
15
+ * stderr warning.
16
+ *
17
+ * `${env:VAR}` substitutions in env/headers values are expanded against
18
+ * `process.env` (or the provided env override).
19
+ */
20
+ import { existsSync, readFileSync } from 'node:fs';
21
+ import { join } from 'node:path';
22
+ import { homedir } from 'node:os';
23
+ /** Returns the path of the canonical `mcp.json` for the workspace, or undefined. */
24
+ export function findMcpConfigPath(opts = {}) {
25
+ const env = opts.env ?? process.env;
26
+ const home = opts.homeDir ?? homedir();
27
+ const candidates = [];
28
+ if (env.ANVIL_MCP_CONFIG)
29
+ candidates.push(env.ANVIL_MCP_CONFIG);
30
+ if (opts.workspaceRoot) {
31
+ candidates.push(join(opts.workspaceRoot, 'mcp.json'), join(opts.workspaceRoot, '.mcp', 'servers.json'), join(opts.workspaceRoot, '.claude', 'mcp.json'));
32
+ }
33
+ candidates.push(join(home, '.claude', 'mcp.json'));
34
+ for (const c of candidates) {
35
+ if (existsSync(c))
36
+ return c;
37
+ }
38
+ return undefined;
39
+ }
40
+ const ENV_VAR_RE = /\$\{env:([A-Z_][A-Z0-9_]*)\}/g;
41
+ function substituteEnvVars(value, env, fieldDesc, warn) {
42
+ return value.replace(ENV_VAR_RE, (_match, name) => {
43
+ const v = env[name];
44
+ if (v === undefined || v === '') {
45
+ warn(`[anvil-mcp] WARN: env var \${env:${name}} unset — ${fieldDesc} resolves to empty`);
46
+ return '';
47
+ }
48
+ return v;
49
+ });
50
+ }
51
+ function expandEntryStrings(obj, env, fieldDesc, warn) {
52
+ if (!obj)
53
+ return undefined;
54
+ const out = {};
55
+ for (const [k, v] of Object.entries(obj)) {
56
+ if (typeof v !== 'string') {
57
+ warn(`[anvil-mcp] WARN: ${fieldDesc}.${k} is not a string; skipping`);
58
+ continue;
59
+ }
60
+ out[k] = substituteEnvVars(v, env, `${fieldDesc}.${k}`, warn);
61
+ }
62
+ return out;
63
+ }
64
+ function inferTransport(entry, name, warn) {
65
+ const hasCmd = typeof entry.command === 'string' && entry.command.length > 0;
66
+ const hasUrl = typeof entry.url === 'string' && entry.url.length > 0;
67
+ if (hasCmd && hasUrl) {
68
+ warn(`[anvil-mcp] WARN: server "${name}" has both command and url; dropping`);
69
+ return undefined;
70
+ }
71
+ if (hasCmd)
72
+ return 'stdio';
73
+ if (hasUrl)
74
+ return 'streamable-http';
75
+ warn(`[anvil-mcp] WARN: server "${name}" has neither command nor url; dropping`);
76
+ return undefined;
77
+ }
78
+ /**
79
+ * Read and parse the `mcp.json` for `workspaceRoot`. Returns `[]` when no
80
+ * config is found (graceful no-op for projects without MCP).
81
+ */
82
+ export function loadMcpServers(opts = {}) {
83
+ const env = opts.env ?? process.env;
84
+ const path = findMcpConfigPath({ ...opts, env });
85
+ if (!path)
86
+ return [];
87
+ let raw;
88
+ try {
89
+ raw = readFileSync(path, 'utf-8');
90
+ }
91
+ catch (err) {
92
+ process.stderr.write(`[anvil-mcp] WARN: cannot read ${path}: ${err.message}\n`);
93
+ return [];
94
+ }
95
+ let parsed;
96
+ try {
97
+ parsed = JSON.parse(raw);
98
+ }
99
+ catch (err) {
100
+ process.stderr.write(`[anvil-mcp] WARN: ${path} is not valid JSON: ${err.message}\n`);
101
+ return [];
102
+ }
103
+ if (!parsed.mcpServers || typeof parsed.mcpServers !== 'object') {
104
+ process.stderr.write(`[anvil-mcp] WARN: ${path} missing top-level "mcpServers" object\n`);
105
+ return [];
106
+ }
107
+ const warn = (msg) => process.stderr.write(msg + '\n');
108
+ const out = [];
109
+ for (const [name, entry] of Object.entries(parsed.mcpServers)) {
110
+ if (!entry || typeof entry !== 'object') {
111
+ warn(`[anvil-mcp] WARN: server "${name}" entry is not an object; dropping`);
112
+ continue;
113
+ }
114
+ const transport = inferTransport(entry, name, warn);
115
+ if (!transport)
116
+ continue;
117
+ out.push({
118
+ name,
119
+ transport,
120
+ command: entry.command,
121
+ args: Array.isArray(entry.args) ? [...entry.args] : undefined,
122
+ env: expandEntryStrings(entry.env, env, `mcpServers.${name}.env`, warn),
123
+ url: entry.url,
124
+ headers: expandEntryStrings(entry.headers, env, `mcpServers.${name}.headers`, warn),
125
+ });
126
+ }
127
+ return out;
128
+ }
129
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/mcp/config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @esankhan3/anvil-agent-core/mcp — Model Context Protocol *client*-side helpers.
3
+ *
4
+ * Companion to `code-search-mcp` (which is the MCP *server* Anvil already
5
+ * publishes). The client side lets Anvil's agent connect to OTHER MCP
6
+ * servers configured per project.
7
+ */
8
+ export type { McpTransport, McpServerConfig, McpServerEntry, McpServersFile, } from './types.js';
9
+ export { loadMcpServers, findMcpConfigPath, type LoadMcpServersOptions, } from './config-loader.js';
10
+ export { McpAgentClient } from './client.js';
11
+ export { buildAgentToolset, type AgentToolset, } from './tool-merger.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @esankhan3/anvil-agent-core/mcp — Model Context Protocol *client*-side helpers.
3
+ *
4
+ * Companion to `code-search-mcp` (which is the MCP *server* Anvil already
5
+ * publishes). The client side lets Anvil's agent connect to OTHER MCP
6
+ * servers configured per project.
7
+ */
8
+ export { loadMcpServers, findMcpConfigPath, } from './config-loader.js';
9
+ export { McpAgentClient } from './client.js';
10
+ export { buildAgentToolset, } from './tool-merger.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EACL,cAAc,EACd,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,iBAAiB,GAElB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `buildAgentToolset` — merge built-in tools with MCP-discovered tools into a
3
+ * single `ToolSchema[]` registered with the LLM provider, plus a dispatch
4
+ * map from namespaced tool name → owning MCP client.
5
+ *
6
+ * Per ADR §H7, the provider doesn't know MCP exists; the agent layer routes
7
+ * tool calls based on whether the name is in `mcpDispatch`.
8
+ */
9
+ import type { ToolSchema } from '../types.js';
10
+ import type { McpAgentClient } from './client.js';
11
+ export interface AgentToolset {
12
+ /** Flat list of tools to pass to `LanguageModel.invokeStream({ tools })`. */
13
+ tools: ToolSchema[];
14
+ /** Maps namespaced tool name to the MCP client that owns it. */
15
+ mcpDispatch: Map<string, McpAgentClient>;
16
+ }
17
+ export declare function buildAgentToolset(builtIn: ToolSchema[], mcpClients: McpAgentClient[]): Promise<AgentToolset>;
18
+ //# sourceMappingURL=tool-merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-merger.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-merger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,gEAAgE;IAChE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,UAAU,EAAE,EACrB,UAAU,EAAE,cAAc,EAAE,GAC3B,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `buildAgentToolset` — merge built-in tools with MCP-discovered tools into a
3
+ * single `ToolSchema[]` registered with the LLM provider, plus a dispatch
4
+ * map from namespaced tool name → owning MCP client.
5
+ *
6
+ * Per ADR §H7, the provider doesn't know MCP exists; the agent layer routes
7
+ * tool calls based on whether the name is in `mcpDispatch`.
8
+ */
9
+ export async function buildAgentToolset(builtIn, mcpClients) {
10
+ const tools = [...builtIn];
11
+ const mcpDispatch = new Map();
12
+ const seen = new Set(builtIn.map((t) => t.name));
13
+ for (const client of mcpClients) {
14
+ let mcpTools;
15
+ try {
16
+ mcpTools = await client.listTools();
17
+ }
18
+ catch (err) {
19
+ process.stderr.write(`[anvil-mcp] WARN: server "${client.config.name}" listTools failed: ${err.message}\n`);
20
+ continue;
21
+ }
22
+ for (const t of mcpTools) {
23
+ if (seen.has(t.name)) {
24
+ process.stderr.write(`[anvil-mcp] WARN: tool name collision "${t.name}"; ignoring duplicate from "${client.config.name}"\n`);
25
+ continue;
26
+ }
27
+ tools.push(t);
28
+ mcpDispatch.set(t.name, client);
29
+ seen.add(t.name);
30
+ }
31
+ }
32
+ return { tools, mcpDispatch };
33
+ }
34
+ //# sourceMappingURL=tool-merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-merger.js","sourceRoot":"","sources":["../../src/mcp/tool-merger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAqB,EACrB,UAA4B;IAE5B,MAAM,KAAK,GAAiB,CAAC,GAAG,OAAO,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjD,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,QAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,MAAM,CAAC,MAAM,CAAC,IAAI,uBAAwB,GAAa,CAAC,OAAO,IAAI,CACjG,CAAC;YACF,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0CAA0C,CAAC,CAAC,IAAI,+BAA+B,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CACvG,CAAC;gBACF,SAAS;YACX,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * MCP client types — agent-layer abstractions over the official SDK's
3
+ * stdio/streamable-http transports.
4
+ *
5
+ * See AGENT-HARNESS-ADR.md §4 for the locked mcp.json schema. Transport is
6
+ * inferred from shape: `command` present → 'stdio'; `url` present →
7
+ * 'streamable-http'; never both.
8
+ */
9
+ export type McpTransport = 'stdio' | 'streamable-http';
10
+ export interface McpServerConfig {
11
+ /** Logical name of the server (used to namespace tools as `<name>/<tool>`). */
12
+ name: string;
13
+ /** Inferred from {command, url} presence at parse time. */
14
+ transport: McpTransport;
15
+ /** stdio: spawn `command args[]` with `env`. */
16
+ command?: string;
17
+ args?: string[];
18
+ env?: Record<string, string>;
19
+ /** streamable-http: POST to `url` with `headers`. */
20
+ url?: string;
21
+ headers?: Record<string, string>;
22
+ }
23
+ /** Raw shape of an `mcp.json` file. */
24
+ export interface McpServersFile {
25
+ mcpServers: Record<string, McpServerEntry>;
26
+ }
27
+ /** Raw shape of one entry inside `mcpServers`. */
28
+ export interface McpServerEntry {
29
+ command?: string;
30
+ args?: string[];
31
+ env?: Record<string, string>;
32
+ url?: string;
33
+ headers?: Record<string, string>;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,iBAAiB,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,SAAS,EAAE,YAAY,CAAC;IACxB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC5C;AAED,kDAAkD;AAClD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * MCP client types — agent-layer abstractions over the official SDK's
3
+ * stdio/streamable-http transports.
4
+ *
5
+ * See AGENT-HARNESS-ADR.md §4 for the locked mcp.json schema. Transport is
6
+ * inferred from shape: `command` present → 'stdio'; `url` present →
7
+ * 'streamable-http'; never both.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Ollama adapter — HTTP API for local Ollama server, no npm dependencies.
3
+ *
4
+ * Base URL: OLLAMA_HOST env var or http://localhost:11434
5
+ * Streaming: NDJSON (not SSE) from POST /api/chat
6
+ *
7
+ * Two modes, picked at runtime by the presence of `config.toolExecutor`:
8
+ *
9
+ * 1. Single-shot chat — no tool executor. Drains one /api/chat
10
+ * response, emits text + result. Backwards-compatible with every
11
+ * caller that existed before agentic support landed.
12
+ *
13
+ * 2. Agentic loop — tool executor present. Each turn the adapter
14
+ * sends `tools: [...]` (OpenAI-compatible JSON Schema), parses
15
+ * `message.tool_calls` from the response, executes each call via
16
+ * the executor, appends the assistant + tool messages to history,
17
+ * and re-POSTs. Loops until the model returns no tool_calls or
18
+ * the `maxToolIterations` cap fires.
19
+ *
20
+ * Capabilities flip to `tier: 'agentic'` because the adapter now drives
21
+ * a full agentic loop. Stage-policy.yaml's build/validate/ship preferences
22
+ * for `local` are real — the adapter can hold its end of those stages.
23
+ */
24
+ import type { ModelAdapter, ModelAdapterConfig, ModelAdapterResult, ProviderCapabilities } from './types.js';
25
+ import { LocalExecutor } from './router/local-executor.js';
26
+ /** Thrown when the conversation history can't be trimmed below num_ctx
27
+ * (e.g. one tool result alone exceeds the window). The dashboard
28
+ * resolver catches this and re-runs the stage with an escalation chain
29
+ * that skips local. */
30
+ export declare class ContextExhaustedError extends Error {
31
+ readonly model: string;
32
+ readonly numCtx: number;
33
+ readonly historyTokens: number;
34
+ constructor(model: string, numCtx: number, historyTokens: number);
35
+ }
36
+ interface OllamaToolCall {
37
+ function: {
38
+ name: string;
39
+ arguments: Record<string, unknown> | string;
40
+ };
41
+ }
42
+ interface ChatMessage {
43
+ role: 'system' | 'user' | 'assistant' | 'tool';
44
+ content: string;
45
+ tool_calls?: OllamaToolCall[];
46
+ tool_call_id?: string;
47
+ }
48
+ export declare class OllamaAdapter implements ModelAdapter {
49
+ private readonly executor;
50
+ readonly provider: "ollama";
51
+ readonly capabilities: ProviderCapabilities;
52
+ /**
53
+ * In-flight AbortControllers — one per concurrent run() invocation.
54
+ * The adapter is a singleton, but per-repo stages (build/validate/
55
+ * specs/tasks) run multiple repos in parallel against it. A single
56
+ * instance-level field would let one call's `finally` block null out
57
+ * the controller while another is still mid-fetch, causing
58
+ * "Cannot read properties of null (reading 'signal')". The Set lets
59
+ * concurrent calls each own their own controller; kill() aborts all.
60
+ */
61
+ private activeControllers;
62
+ /**
63
+ * @param executor — Single-slot FIFO queue used when a call sets
64
+ * `config.exclusiveSlot === true`. Defaults to the process-wide
65
+ * singleton; tests inject a fresh instance for isolation.
66
+ */
67
+ constructor(executor?: LocalExecutor);
68
+ supportsModel(_modelId: string): boolean;
69
+ getModelPricing(_modelId: string): [number, number] | null;
70
+ checkAvailability(): Promise<{
71
+ available: boolean;
72
+ version?: string;
73
+ error?: string;
74
+ }>;
75
+ kill(): void;
76
+ run(config: ModelAdapterConfig, output: NodeJS.WritableStream): Promise<ModelAdapterResult>;
77
+ private runInner;
78
+ /**
79
+ * One round-trip with Ollama: send messages + tools, drain the NDJSON
80
+ * stream, return the assistant's text accumulator + any tool_calls
81
+ * the model emitted in the final chunk.
82
+ */
83
+ private runOneTurn;
84
+ }
85
+ /**
86
+ * Drop the oldest tool-role messages until the history fits below
87
+ * SOFT_TRIM_RATIO × numCtx. Keeps system + user prompts intact (they
88
+ * carry the original task framing) and keeps the most recent turns
89
+ * intact (where the active state of the loop lives). If we can't trim
90
+ * enough — e.g. a single tool_result is bigger than the window —
91
+ * escalate via ContextExhaustedError.
92
+ */
93
+ export declare function trimHistoryIfNeeded(messages: ChatMessage[], numCtx: number, model: string): void;
94
+ export {};
95
+ //# sourceMappingURL=ollama-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-adapter.d.ts","sourceRoot":"","sources":["../src/ollama-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EAIrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAiB,MAAM,4BAA4B,CAAC;AAmB1E;;;wBAGwB;AACxB,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBACnB,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;CAUjE;AAuBD,UAAU,cAAc;IACtB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;KAC7C,CAAC;CACH;AAWD,UAAU,WAAW;IACnB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,qBAAa,aAAc,YAAW,YAAY;IA+BpC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IA9BrC,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAEtC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAUzC;IAEF;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB,CAA8B;IAEvD;;;;OAIG;gBAC0B,QAAQ,GAAE,aAA6B;IAEpE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKxC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAIpD,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAY5F,IAAI,IAAI,IAAI;IAON,GAAG,CACP,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,MAAM,CAAC,cAAc,GAC5B,OAAO,CAAC,kBAAkB,CAAC;YAOhB,QAAQ;IAsGtB;;;;OAIG;YACW,UAAU;CAuGzB;AAwED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,IAAI,CAgBN"}