@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,268 @@
1
+ /**
2
+ * Phase 4 — agentic loop tests for OllamaAdapter. Mocks `globalThis.fetch`
3
+ * to drive multi-turn tool-call scenarios without contacting Ollama.
4
+ *
5
+ * Coverage:
6
+ * - Single-turn no-tool happy path (regression baseline).
7
+ * - Single tool call → result → text completion.
8
+ * - Multi-turn (3 calls) before completion.
9
+ * - Iteration cap → stopReason: 'iteration_limit'.
10
+ * - Tool execution returns isError:true → emitted on stream, model recovers.
11
+ * - AbortSignal mid-loop → clean exit, no leaked sockets.
12
+ * - Malformed tool_calls JSON → graceful failure (raw arg surfaces).
13
+ */
14
+ import { describe, it, before, after } from 'node:test';
15
+ import assert from 'node:assert/strict';
16
+ import { OllamaAdapter, trimHistoryIfNeeded, ContextExhaustedError } from '../ollama-adapter.js';
17
+ import { LocalExecutor } from '../router/local-executor.js';
18
+ // ────────────────────────────────────────────────────────────────────────
19
+ // Fixtures
20
+ // ────────────────────────────────────────────────────────────────────────
21
+ function makeOllamaTextResponse(text) {
22
+ const lines = [
23
+ JSON.stringify({ message: { content: text } }),
24
+ JSON.stringify({ done: true, prompt_eval_count: 5, eval_count: 7, total_duration: 1_000_000 }),
25
+ ];
26
+ return new Response(lines.join('\n') + '\n', { status: 200 });
27
+ }
28
+ function makeOllamaToolCallResponse(name, args, trailingText = '') {
29
+ const lines = [];
30
+ if (trailingText)
31
+ lines.push(JSON.stringify({ message: { content: trailingText } }));
32
+ lines.push(JSON.stringify({
33
+ done: true,
34
+ prompt_eval_count: 3,
35
+ eval_count: 2,
36
+ total_duration: 500_000,
37
+ message: {
38
+ role: 'assistant',
39
+ content: '',
40
+ tool_calls: [{ function: { name, arguments: args } }],
41
+ },
42
+ }));
43
+ return new Response(lines.join('\n') + '\n', { status: 200 });
44
+ }
45
+ class StubWritable {
46
+ chunks = [];
47
+ write(chunk) {
48
+ this.chunks.push(typeof chunk === 'string' ? chunk : new TextDecoder().decode(chunk));
49
+ return true;
50
+ }
51
+ end() { }
52
+ on() { }
53
+ parsedLines() {
54
+ return this.chunks.join('').split('\n').filter(Boolean).map((l) => JSON.parse(l));
55
+ }
56
+ }
57
+ class FakeExecutor {
58
+ handlers;
59
+ calls = [];
60
+ constructor(handlers) {
61
+ this.handlers = handlers;
62
+ }
63
+ listSchemas() {
64
+ return Object.keys(this.handlers).map((name) => ({
65
+ name,
66
+ description: `${name} tool`,
67
+ inputSchema: { type: 'object', properties: {} },
68
+ }));
69
+ }
70
+ async execute(call) {
71
+ this.calls.push(call);
72
+ const h = this.handlers[call.name];
73
+ if (!h)
74
+ return { content: `unknown ${call.name}`, isError: true };
75
+ return h(call.arguments);
76
+ }
77
+ }
78
+ const baseConfig = {
79
+ userPrompt: 'do the thing',
80
+ model: 'qwen3:14b',
81
+ workingDir: '/tmp',
82
+ stage: 'build',
83
+ persona: 'engineer',
84
+ };
85
+ let originalFetch;
86
+ before(() => { originalFetch = globalThis.fetch; });
87
+ after(() => { globalThis.fetch = originalFetch; });
88
+ // ────────────────────────────────────────────────────────────────────────
89
+ // Tests
90
+ // ────────────────────────────────────────────────────────────────────────
91
+ describe('OllamaAdapter — single-shot (no toolExecutor)', () => {
92
+ it('completes one turn and emits a result', async () => {
93
+ globalThis.fetch = (async () => makeOllamaTextResponse('hello world'));
94
+ const exec = new LocalExecutor({ evict: async () => undefined });
95
+ const adapter = new OllamaAdapter(exec);
96
+ const sink = new StubWritable();
97
+ const r = await adapter.run({ ...baseConfig }, sink);
98
+ assert.equal(r.output, 'hello world');
99
+ assert.equal(r.stopReason, 'end_turn');
100
+ assert.equal(r.toolCallCount, 0);
101
+ const lines = sink.parsedLines();
102
+ assert.equal(lines.at(-1)?.type, 'result');
103
+ });
104
+ });
105
+ describe('OllamaAdapter — agentic loop', () => {
106
+ it('executes a single tool call then completes on the next turn', async () => {
107
+ let turn = 0;
108
+ globalThis.fetch = (async () => {
109
+ turn++;
110
+ if (turn === 1)
111
+ return makeOllamaToolCallResponse('list', {});
112
+ return makeOllamaTextResponse('done');
113
+ });
114
+ const fx = new FakeExecutor({ list: () => ({ content: 'a.txt\nb.txt', isError: false }) });
115
+ const adapter = new OllamaAdapter(new LocalExecutor({ evict: async () => undefined }));
116
+ const sink = new StubWritable();
117
+ const r = await adapter.run({ ...baseConfig, toolExecutor: fx }, sink);
118
+ assert.equal(turn, 2, 'should round-trip exactly twice');
119
+ assert.equal(fx.calls.length, 1);
120
+ assert.equal(fx.calls[0].name, 'list');
121
+ assert.equal(r.toolCallCount, 1);
122
+ assert.equal(r.stopReason, 'end_turn');
123
+ const lines = sink.parsedLines();
124
+ const toolUse = lines.find((l) => l.message?.content?.[0]?.type === 'tool_use');
125
+ const toolResult = lines.find((l) => l.message?.content?.[0]?.type === 'tool_result');
126
+ assert.ok(toolUse, 'tool_use line emitted');
127
+ assert.ok(toolResult, 'tool_result line emitted');
128
+ });
129
+ it('handles three tool calls before completing', async () => {
130
+ let turn = 0;
131
+ globalThis.fetch = (async () => {
132
+ turn++;
133
+ if (turn <= 3)
134
+ return makeOllamaToolCallResponse('grep', { pattern: `p${turn}` });
135
+ return makeOllamaTextResponse('finally done');
136
+ });
137
+ const fx = new FakeExecutor({ grep: (args) => ({ content: `match for ${args.pattern}`, isError: false }) });
138
+ const adapter = new OllamaAdapter(new LocalExecutor({ evict: async () => undefined }));
139
+ const r = await adapter.run({ ...baseConfig, toolExecutor: fx }, new StubWritable());
140
+ assert.equal(turn, 4);
141
+ assert.equal(fx.calls.length, 3);
142
+ assert.equal(r.toolCallCount, 3);
143
+ assert.equal(r.stopReason, 'end_turn');
144
+ });
145
+ it('hits iteration cap and surfaces stopReason:iteration_limit', async () => {
146
+ globalThis.fetch = (async () => makeOllamaToolCallResponse('list', {}));
147
+ const fx = new FakeExecutor({ list: () => ({ content: 'x', isError: false }) });
148
+ const adapter = new OllamaAdapter(new LocalExecutor({ evict: async () => undefined }));
149
+ const r = await adapter.run({ ...baseConfig, toolExecutor: fx, maxToolIterations: 3 }, new StubWritable());
150
+ assert.equal(r.stopReason, 'iteration_limit');
151
+ assert.equal(fx.calls.length, 3);
152
+ });
153
+ it('surfaces tool errors via tool_result with is_error:true and lets the model recover', async () => {
154
+ let turn = 0;
155
+ globalThis.fetch = (async () => {
156
+ turn++;
157
+ if (turn === 1)
158
+ return makeOllamaToolCallResponse('read_file', { path: '/etc/passwd' });
159
+ return makeOllamaTextResponse('ok will retry differently');
160
+ });
161
+ const fx = new FakeExecutor({ read_file: () => ({ content: 'Path escapes workingDir', isError: true }) });
162
+ const adapter = new OllamaAdapter(new LocalExecutor({ evict: async () => undefined }));
163
+ const sink = new StubWritable();
164
+ const r = await adapter.run({ ...baseConfig, toolExecutor: fx }, sink);
165
+ assert.equal(r.stopReason, 'end_turn');
166
+ const lines = sink.parsedLines();
167
+ const errResult = lines.find((l) => l.message?.content?.[0]?.type === 'tool_result' && l.message.content[0].is_error === true);
168
+ assert.ok(errResult, 'tool_result emitted with is_error:true');
169
+ });
170
+ it('aborts cleanly when adapter.kill() fires mid-loop', async () => {
171
+ let turn = 0;
172
+ const adapter = new OllamaAdapter(new LocalExecutor({ evict: async () => undefined }));
173
+ globalThis.fetch = (async () => {
174
+ turn++;
175
+ if (turn === 2) {
176
+ // kill() flips abortController.signal.aborted=true. The loop
177
+ // checks the flag after each tool execution and exits with
178
+ // stopReason='aborted'.
179
+ adapter.kill();
180
+ // Throw so the in-flight fetch resolves to an error path the
181
+ // adapter must propagate as the loop unwinds.
182
+ throw new Error('aborted');
183
+ }
184
+ return makeOllamaToolCallResponse('list', {});
185
+ });
186
+ const fx = new FakeExecutor({ list: () => ({ content: 'x', isError: false }) });
187
+ const r = await adapter.run({ ...baseConfig, toolExecutor: fx, maxToolIterations: 10 }, new StubWritable()).catch((err) => err);
188
+ // The thrown fetch rejects out of runOneTurn — that's the contract.
189
+ // What we care about is that no zombie state lingers (abortController
190
+ // gets nulled in finally) and the error message points to abort.
191
+ assert.ok(r instanceof Error);
192
+ assert.match(r.message.toLowerCase(), /abort/);
193
+ });
194
+ it('accepts string-encoded tool arguments and parses them as JSON', async () => {
195
+ let turn = 0;
196
+ globalThis.fetch = (async () => {
197
+ turn++;
198
+ if (turn === 1) {
199
+ // Some Ollama builds emit arguments as a JSON-stringified blob.
200
+ const lines = [
201
+ JSON.stringify({
202
+ done: true,
203
+ prompt_eval_count: 1,
204
+ eval_count: 1,
205
+ total_duration: 100_000,
206
+ message: {
207
+ role: 'assistant',
208
+ content: '',
209
+ tool_calls: [{ function: { name: 'grep', arguments: '{"pattern":"foo"}' } }],
210
+ },
211
+ }),
212
+ ];
213
+ return new Response(lines.join('\n') + '\n', { status: 200 });
214
+ }
215
+ return makeOllamaTextResponse('done');
216
+ });
217
+ const fx = new FakeExecutor({ grep: (args) => ({ content: JSON.stringify(args), isError: false }) });
218
+ const adapter = new OllamaAdapter(new LocalExecutor({ evict: async () => undefined }));
219
+ await adapter.run({ ...baseConfig, toolExecutor: fx }, new StubWritable());
220
+ assert.equal(fx.calls[0].arguments.pattern, 'foo');
221
+ });
222
+ it('trims oldest tool_result when history exceeds soft cap', () => {
223
+ const messages = [
224
+ { role: 'system', content: 'system prompt' },
225
+ { role: 'user', content: 'do task' },
226
+ { role: 'assistant', content: '', tool_calls: [{ function: { name: 'read_file', arguments: { path: 'a' } } }] },
227
+ // First tool result is huge — should get dropped.
228
+ { role: 'tool', content: 'A'.repeat(20_000), tool_call_id: 't1' },
229
+ { role: 'assistant', content: '', tool_calls: [{ function: { name: 'read_file', arguments: { path: 'b' } } }] },
230
+ { role: 'tool', content: 'short', tool_call_id: 't2' },
231
+ ];
232
+ // numCtx ≈ 2000 tokens, soft cap ≈ 1700. With 20k chars of tool
233
+ // content (≈ 5000 tokens estimated), trim must drop the big result.
234
+ trimHistoryIfNeeded(messages, 2000, 'qwen3:14b');
235
+ const toolMessages = messages.filter((m) => m.role === 'tool');
236
+ assert.equal(toolMessages.length, 1, 'one tool result should remain');
237
+ assert.equal(toolMessages[0].content, 'short');
238
+ });
239
+ it('throws ContextExhaustedError when even trimming cannot bring history below num_ctx', () => {
240
+ const messages = [
241
+ { role: 'system', content: 'A'.repeat(40_000) }, // ~10k tokens, untrimmable
242
+ { role: 'user', content: 'go' },
243
+ ];
244
+ assert.throws(() => trimHistoryIfNeeded(messages, 2000, 'qwen3:14b'), ContextExhaustedError);
245
+ });
246
+ it('does NOT trim when history fits comfortably', () => {
247
+ const messages = [
248
+ { role: 'system', content: 'short system' },
249
+ { role: 'user', content: 'hi' },
250
+ { role: 'tool', content: 'ok', tool_call_id: 't1' },
251
+ ];
252
+ const before = JSON.stringify(messages);
253
+ trimHistoryIfNeeded(messages, 16384, 'qwen3:14b');
254
+ assert.equal(JSON.stringify(messages), before, 'no mutation expected');
255
+ });
256
+ it('passes num_ctx in the request options', async () => {
257
+ let observedBody;
258
+ globalThis.fetch = (async (_url, init) => {
259
+ observedBody = init?.body;
260
+ return makeOllamaTextResponse('hi');
261
+ });
262
+ const adapter = new OllamaAdapter(new LocalExecutor({ evict: async () => undefined }));
263
+ await adapter.run({ ...baseConfig, contextWindow: 8192 }, new StubWritable());
264
+ const body = JSON.parse(observedBody);
265
+ assert.equal(body.options.num_ctx, 8192);
266
+ });
267
+ });
268
+ //# sourceMappingURL=ollama-adapter-agentic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-adapter-agentic.test.js","sourceRoot":"","sources":["../../src/__tests__/ollama-adapter-agentic.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Phase 6 — verify OllamaAdapter routes through the local executor when
3
+ * `config.exclusiveSlot === true`, and bypasses it otherwise.
4
+ *
5
+ * Mocks `globalThis.fetch` to return a tiny NDJSON stream so the adapter
6
+ * runs end-to-end without contacting Ollama. Each test uses a fresh
7
+ * LocalExecutor for isolation.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=ollama-adapter-executor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-adapter-executor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ollama-adapter-executor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Phase 6 — verify OllamaAdapter routes through the local executor when
3
+ * `config.exclusiveSlot === true`, and bypasses it otherwise.
4
+ *
5
+ * Mocks `globalThis.fetch` to return a tiny NDJSON stream so the adapter
6
+ * runs end-to-end without contacting Ollama. Each test uses a fresh
7
+ * LocalExecutor for isolation.
8
+ */
9
+ import { describe, it, before, after, beforeEach } from 'node:test';
10
+ import assert from 'node:assert/strict';
11
+ import { OllamaAdapter } from '../ollama-adapter.js';
12
+ import { LocalExecutor } from '../router/local-executor.js';
13
+ // Helper: compose an NDJSON stream Ollama-style.
14
+ function makeOllamaResponse(text) {
15
+ const lines = [
16
+ JSON.stringify({ message: { content: text } }),
17
+ JSON.stringify({ done: true, prompt_eval_count: 1, eval_count: 1, total_duration: 1_000_000 }),
18
+ ];
19
+ const body = lines.join('\n') + '\n';
20
+ return new Response(body, {
21
+ status: 200,
22
+ headers: { 'Content-Type': 'application/x-ndjson' },
23
+ });
24
+ }
25
+ class StubWritable {
26
+ chunks = [];
27
+ write(chunk) {
28
+ this.chunks.push(typeof chunk === 'string' ? chunk : new TextDecoder().decode(chunk));
29
+ return true;
30
+ }
31
+ end() { }
32
+ on() { }
33
+ }
34
+ const baseConfig = {
35
+ userPrompt: 'hello',
36
+ model: 'qwen2.5-coder:7b',
37
+ workingDir: '/tmp',
38
+ stage: 'build',
39
+ persona: 'developer',
40
+ };
41
+ let originalFetch;
42
+ before(() => { originalFetch = globalThis.fetch; });
43
+ after(() => { globalThis.fetch = originalFetch; });
44
+ beforeEach(() => { });
45
+ describe('OllamaAdapter — exclusiveSlot routing', () => {
46
+ it('does NOT touch the executor when exclusiveSlot is unset', async () => {
47
+ globalThis.fetch = (async () => makeOllamaResponse('hi'));
48
+ const exec = new LocalExecutor({ evict: async () => { } });
49
+ const adapter = new OllamaAdapter(exec);
50
+ await adapter.run({ ...baseConfig }, new StubWritable());
51
+ assert.equal(exec.inspect().loaded, null, 'executor must remain idle');
52
+ assert.equal(exec.inspect().queueDepth, 0);
53
+ });
54
+ it('routes through the executor when exclusiveSlot is true', async () => {
55
+ globalThis.fetch = (async () => makeOllamaResponse('hi'));
56
+ const exec = new LocalExecutor({ evict: async () => { } });
57
+ const adapter = new OllamaAdapter(exec);
58
+ await adapter.run({ ...baseConfig, exclusiveSlot: true }, new StubWritable());
59
+ assert.equal(exec.inspect().loaded, 'qwen2.5-coder:7b');
60
+ });
61
+ it('serializes parallel exclusiveSlot calls (FIFO)', async () => {
62
+ const callOrder = [];
63
+ let fetchCount = 0;
64
+ globalThis.fetch = (async () => {
65
+ const id = ++fetchCount;
66
+ callOrder.push(`fetch-${id}-start`);
67
+ await new Promise((r) => setTimeout(r, 10));
68
+ callOrder.push(`fetch-${id}-end`);
69
+ return makeOllamaResponse(`r${id}`);
70
+ });
71
+ const exec = new LocalExecutor({ evict: async () => { } });
72
+ const adapter = new OllamaAdapter(exec);
73
+ const p1 = adapter.run({ ...baseConfig, model: 'qwen2.5-coder:7b', exclusiveSlot: true }, new StubWritable());
74
+ const p2 = adapter.run({ ...baseConfig, model: 'qwen2.5-coder:7b', exclusiveSlot: true }, new StubWritable());
75
+ await Promise.all([p1, p2]);
76
+ // Strict serialization → no interleaving of starts.
77
+ assert.deepEqual(callOrder, [
78
+ 'fetch-1-start',
79
+ 'fetch-1-end',
80
+ 'fetch-2-start',
81
+ 'fetch-2-end',
82
+ ]);
83
+ });
84
+ it('triggers eviction when switching models under exclusiveSlot', async () => {
85
+ globalThis.fetch = (async () => makeOllamaResponse('hi'));
86
+ const evictions = [];
87
+ const exec = new LocalExecutor({ evict: async (id) => { evictions.push(id); } });
88
+ const adapter = new OllamaAdapter(exec);
89
+ await adapter.run({ ...baseConfig, model: 'qwen2.5-coder:7b', exclusiveSlot: true }, new StubWritable());
90
+ await adapter.run({ ...baseConfig, model: 'gemma3:4b', exclusiveSlot: true }, new StubWritable());
91
+ assert.deepEqual(evictions, ['qwen2.5-coder:7b']);
92
+ assert.equal(exec.inspect().loaded, 'gemma3:4b');
93
+ });
94
+ });
95
+ //# sourceMappingURL=ollama-adapter-executor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-adapter-executor.test.js","sourceRoot":"","sources":["../../src/__tests__/ollama-adapter-executor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * OpenAI adapter — output-token ceiling + finish_reason normalization.
3
+ *
4
+ * Verifies:
5
+ * - `ModelAdapterConfig.maxOutputTokens` is forwarded as `max_tokens` in
6
+ * the request body.
7
+ * - SSE `finish_reason: 'length'` is normalized to `stopReason: 'max_tokens'`
8
+ * on the returned `ModelAdapterResult`.
9
+ * - Natural finishes (`'stop'`) are passed through unchanged.
10
+ *
11
+ * Ported from packages/dashboard/server/__tests__/output-token-ceiling.test.ts
12
+ * during the Phase 1 dashboard adapter consolidation — the behavior moved
13
+ * from dashboard's local `ApiAdapter` into the agent-core adapter that the
14
+ * dashboard now bridges to.
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=openai-adapter-output.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-adapter-output.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/openai-adapter-output.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * OpenAI adapter — output-token ceiling + finish_reason normalization.
3
+ *
4
+ * Verifies:
5
+ * - `ModelAdapterConfig.maxOutputTokens` is forwarded as `max_tokens` in
6
+ * the request body.
7
+ * - SSE `finish_reason: 'length'` is normalized to `stopReason: 'max_tokens'`
8
+ * on the returned `ModelAdapterResult`.
9
+ * - Natural finishes (`'stop'`) are passed through unchanged.
10
+ *
11
+ * Ported from packages/dashboard/server/__tests__/output-token-ceiling.test.ts
12
+ * during the Phase 1 dashboard adapter consolidation — the behavior moved
13
+ * from dashboard's local `ApiAdapter` into the agent-core adapter that the
14
+ * dashboard now bridges to.
15
+ */
16
+ import { describe, it } from 'node:test';
17
+ import assert from 'node:assert/strict';
18
+ import { Writable } from 'node:stream';
19
+ import { OpenAIAdapter } from '../openai-adapter.js';
20
+ function nullSink() {
21
+ return new Writable({ write: (_chunk, _enc, cb) => cb() });
22
+ }
23
+ function ssePayload(body) {
24
+ return new Response(body, {
25
+ status: 200,
26
+ headers: { 'Content-Type': 'text/event-stream' },
27
+ });
28
+ }
29
+ describe('OpenAIAdapter — output-token ceiling', () => {
30
+ it('forwards config.maxOutputTokens as max_tokens in the request body', async () => {
31
+ let capturedBody = null;
32
+ const originalFetch = globalThis.fetch;
33
+ globalThis.fetch = (async (_url, init) => {
34
+ capturedBody = init?.body ? JSON.parse(init.body) : null;
35
+ return ssePayload('data: {"choices":[{"delta":{"content":"hi"},"finish_reason":null}]}\n\n' +
36
+ 'data: {"choices":[{"delta":{},"finish_reason":"stop"}]}\n\n' +
37
+ 'data: [DONE]\n\n');
38
+ });
39
+ const previousKey = process.env.OPENAI_API_KEY;
40
+ process.env.OPENAI_API_KEY = 'test-key';
41
+ try {
42
+ const adapter = new OpenAIAdapter();
43
+ await adapter.run({
44
+ userPrompt: 'hello',
45
+ model: 'gpt-4o-mini',
46
+ workingDir: process.cwd(),
47
+ stage: '',
48
+ persona: '',
49
+ maxOutputTokens: 1234,
50
+ }, nullSink());
51
+ }
52
+ finally {
53
+ globalThis.fetch = originalFetch;
54
+ if (previousKey === undefined)
55
+ delete process.env.OPENAI_API_KEY;
56
+ else
57
+ process.env.OPENAI_API_KEY = previousKey;
58
+ }
59
+ assert.ok(capturedBody, 'fetch should have been called');
60
+ assert.equal(capturedBody.max_tokens, 1234);
61
+ });
62
+ it("normalizes finish_reason 'length' → stopReason 'max_tokens'", async () => {
63
+ const originalFetch = globalThis.fetch;
64
+ globalThis.fetch = (async () => ssePayload('data: {"choices":[{"delta":{"content":"truncated"},"finish_reason":null}]}\n\n' +
65
+ 'data: {"choices":[{"delta":{},"finish_reason":"length"}]}\n\n' +
66
+ 'data: [DONE]\n\n'));
67
+ const previousKey = process.env.OPENAI_API_KEY;
68
+ process.env.OPENAI_API_KEY = 'test-key';
69
+ let result;
70
+ try {
71
+ const adapter = new OpenAIAdapter();
72
+ result = await adapter.run({
73
+ userPrompt: 'hi',
74
+ model: 'gpt-4o-mini',
75
+ workingDir: process.cwd(),
76
+ stage: '',
77
+ persona: '',
78
+ }, nullSink());
79
+ }
80
+ finally {
81
+ globalThis.fetch = originalFetch;
82
+ if (previousKey === undefined)
83
+ delete process.env.OPENAI_API_KEY;
84
+ else
85
+ process.env.OPENAI_API_KEY = previousKey;
86
+ }
87
+ assert.equal(result.stopReason, 'max_tokens');
88
+ });
89
+ it("normalizes natural finish_reason 'stop' → stopReason 'end_turn'", async () => {
90
+ // Cross-provider normalization inherited from OpenRouterAdapter:
91
+ // a tool-loop that ends with no further tool_calls reports
92
+ // `stopReason: 'end_turn'` (Anthropic-style) regardless of which
93
+ // upstream provider sent the raw `finish_reason: 'stop'`. This
94
+ // gives downstream telemetry a single stop-reason vocabulary.
95
+ const originalFetch = globalThis.fetch;
96
+ globalThis.fetch = (async () => ssePayload('data: {"choices":[{"delta":{"content":"ok"},"finish_reason":null}]}\n\n' +
97
+ 'data: {"choices":[{"delta":{},"finish_reason":"stop"}]}\n\n' +
98
+ 'data: [DONE]\n\n'));
99
+ const previousKey = process.env.OPENAI_API_KEY;
100
+ process.env.OPENAI_API_KEY = 'test-key';
101
+ let result;
102
+ try {
103
+ const adapter = new OpenAIAdapter();
104
+ result = await adapter.run({
105
+ userPrompt: 'hi',
106
+ model: 'gpt-4o-mini',
107
+ workingDir: process.cwd(),
108
+ stage: '',
109
+ persona: '',
110
+ }, nullSink());
111
+ }
112
+ finally {
113
+ globalThis.fetch = originalFetch;
114
+ if (previousKey === undefined)
115
+ delete process.env.OPENAI_API_KEY;
116
+ else
117
+ process.env.OPENAI_API_KEY = previousKey;
118
+ }
119
+ assert.equal(result.stopReason, 'end_turn');
120
+ });
121
+ it('declares capabilities.maxOutputTokens=true and capabilities.cache=auto', () => {
122
+ const adapter = new OpenAIAdapter();
123
+ assert.equal(adapter.capabilities.maxOutputTokens, true);
124
+ assert.equal(adapter.capabilities.cache, 'auto');
125
+ });
126
+ });
127
+ //# sourceMappingURL=openai-adapter-output.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-adapter-output.test.js","sourceRoot":"","sources":["../../src/__tests__/openai-adapter-output.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * OpenCode Go adapter — verifies the prefix-stripping + auth wiring on
3
+ * top of the inherited agentic OpenAI loop. Doesn't re-test the loop
4
+ * itself (covered by the OpenRouter agentic suite).
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=opencode-adapter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-adapter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/opencode-adapter.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}