@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,39 @@
1
+ /**
2
+ * GenAI semantic-convention attribute keys.
3
+ *
4
+ * Mirrors the OpenTelemetry GenAI SIG spec
5
+ * (https://opentelemetry.io/docs/specs/semconv/gen-ai/llm-spans/) plus
6
+ * Anvil-specific extensions for cost USD, cache tokens, and tool argument
7
+ * size. Anvil-extension attributes follow the same `gen_ai.*` namespace so
8
+ * backends without LLM-specific UIs still render them as plain attributes.
9
+ */
10
+ export const GenAi = {
11
+ // -- Spec --------------------------------------------------------------
12
+ SYSTEM: 'gen_ai.system',
13
+ REQUEST_MODEL: 'gen_ai.request.model',
14
+ REQUEST_MAX_TOKENS: 'gen_ai.request.max_tokens',
15
+ REQUEST_TEMPERATURE: 'gen_ai.request.temperature',
16
+ RESPONSE_FINISH_REASONS: 'gen_ai.response.finish_reasons',
17
+ RESPONSE_MODEL: 'gen_ai.response.model',
18
+ RESPONSE_ID: 'gen_ai.response.id',
19
+ USAGE_INPUT_TOKENS: 'gen_ai.usage.input_tokens',
20
+ USAGE_OUTPUT_TOKENS: 'gen_ai.usage.output_tokens',
21
+ TOOL_NAME: 'gen_ai.tool.name',
22
+ // -- Anvil extensions --------------------------------------------------
23
+ USAGE_CACHE_READ_TOKENS: 'gen_ai.usage.cache_read_tokens',
24
+ USAGE_CACHE_WRITE_TOKENS: 'gen_ai.usage.cache_write_tokens',
25
+ USAGE_CACHE_HIT_RATIO: 'gen_ai.usage.cache_hit_ratio',
26
+ USAGE_COST_USD: 'gen_ai.usage.cost_usd',
27
+ USAGE_COST_INPUT_USD: 'gen_ai.usage.cost_input_usd',
28
+ USAGE_COST_OUTPUT_USD: 'gen_ai.usage.cost_output_usd',
29
+ USAGE_COST_CACHE_READ_USD: 'gen_ai.usage.cost_cache_read_usd',
30
+ USAGE_COST_CACHE_WRITE_USD: 'gen_ai.usage.cost_cache_write_usd',
31
+ TOOL_ARGUMENTS_SIZE: 'gen_ai.tool.arguments_size_bytes',
32
+ REASONING_TOKENS: 'gen_ai.reasoning.tokens',
33
+ REASONING_TEXT: 'gen_ai.reasoning.text',
34
+ MESSAGES_COUNT: 'gen_ai.messages.count',
35
+ TOOLS_COUNT: 'gen_ai.tools.count',
36
+ PROMPT: 'gen_ai.prompt',
37
+ COMPLETION: 'gen_ai.completion',
38
+ };
39
+ //# sourceMappingURL=attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../src/telemetry/attributes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,yEAAyE;IACzE,MAAM,EAAE,eAAe;IACvB,aAAa,EAAE,sBAAsB;IACrC,kBAAkB,EAAE,2BAA2B;IAC/C,mBAAmB,EAAE,4BAA4B;IACjD,uBAAuB,EAAE,gCAAgC;IACzD,cAAc,EAAE,uBAAuB;IACvC,WAAW,EAAE,oBAAoB;IACjC,kBAAkB,EAAE,2BAA2B;IAC/C,mBAAmB,EAAE,4BAA4B;IACjD,SAAS,EAAE,kBAAkB;IAE7B,yEAAyE;IACzE,uBAAuB,EAAE,gCAAgC;IACzD,wBAAwB,EAAE,iCAAiC;IAC3D,qBAAqB,EAAE,8BAA8B;IACrD,cAAc,EAAE,uBAAuB;IACvC,oBAAoB,EAAE,6BAA6B;IACnD,qBAAqB,EAAE,8BAA8B;IACrD,yBAAyB,EAAE,kCAAkC;IAC7D,0BAA0B,EAAE,mCAAmC;IAC/D,mBAAmB,EAAE,kCAAkC;IACvD,gBAAgB,EAAE,yBAAyB;IAC3C,cAAc,EAAE,uBAAuB;IACvC,cAAc,EAAE,uBAAuB;IACvC,WAAW,EAAE,oBAAoB;IACjC,MAAM,EAAE,eAAe;IACvB,UAAU,EAAE,mBAAmB;CACvB,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Telemetry configuration — resolved from environment variables.
3
+ *
4
+ * Resolution order:
5
+ * 1. ANVIL_OTEL_DISABLED=1 → disabled (kill-switch wins)
6
+ * 2. OTEL_EXPORTER_OTLP_ENDPOINT set → otlp mode, enabled
7
+ * 3. ANVIL_OTEL_CONSOLE=1 → console mode, enabled
8
+ * 4. otherwise → noop mode, disabled
9
+ *
10
+ * Prompt content recording is OFF by default — opt in via
11
+ * ANVIL_OTEL_RECORD_CONTENT=1 (decision O5).
12
+ */
13
+ export interface TelemetryConfig {
14
+ /** True when at least one exporter is wired up. */
15
+ enabled: boolean;
16
+ /** Which exporter the tracer should install. */
17
+ exporterMode: 'noop' | 'console' | 'otlp';
18
+ /** OTLP endpoint URL. Only meaningful when exporterMode === 'otlp'. */
19
+ endpoint?: string;
20
+ /** Headers parsed from OTEL_EXPORTER_OTLP_HEADERS (key=value pairs, comma separated). */
21
+ headers?: Record<string, string>;
22
+ /** When true, prompt + completion text are attached to spans. Default false. */
23
+ recordContent: boolean;
24
+ /** Resource attribute service.name. */
25
+ serviceName: string;
26
+ /** Optional sampler hint (mirrors OTEL_TRACES_SAMPLER); the SDK reads this env var natively. */
27
+ sampler?: string;
28
+ }
29
+ export declare function loadTelemetryConfig(): TelemetryConfig;
30
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gFAAgF;IAChF,aAAa,EAAE,OAAO,CAAC;IACvB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAeD,wBAAgB,mBAAmB,IAAI,eAAe,CA0BrD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Telemetry configuration — resolved from environment variables.
3
+ *
4
+ * Resolution order:
5
+ * 1. ANVIL_OTEL_DISABLED=1 → disabled (kill-switch wins)
6
+ * 2. OTEL_EXPORTER_OTLP_ENDPOINT set → otlp mode, enabled
7
+ * 3. ANVIL_OTEL_CONSOLE=1 → console mode, enabled
8
+ * 4. otherwise → noop mode, disabled
9
+ *
10
+ * Prompt content recording is OFF by default — opt in via
11
+ * ANVIL_OTEL_RECORD_CONTENT=1 (decision O5).
12
+ */
13
+ function parseHeaders(raw) {
14
+ if (!raw)
15
+ return undefined;
16
+ const out = {};
17
+ for (const pair of raw.split(',')) {
18
+ const idx = pair.indexOf('=');
19
+ if (idx <= 0)
20
+ continue;
21
+ const key = pair.slice(0, idx).trim();
22
+ const value = pair.slice(idx + 1).trim();
23
+ if (key)
24
+ out[key] = value;
25
+ }
26
+ return Object.keys(out).length > 0 ? out : undefined;
27
+ }
28
+ export function loadTelemetryConfig() {
29
+ const disabled = process.env.ANVIL_OTEL_DISABLED === '1';
30
+ const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim();
31
+ const consoleFlag = process.env.ANVIL_OTEL_CONSOLE === '1';
32
+ const recordContent = process.env.ANVIL_OTEL_RECORD_CONTENT === '1';
33
+ const serviceName = process.env.OTEL_SERVICE_NAME?.trim() || 'anvil-agent-core';
34
+ const sampler = process.env.OTEL_TRACES_SAMPLER?.trim() || undefined;
35
+ if (disabled) {
36
+ return { enabled: false, exporterMode: 'noop', recordContent: false, serviceName, sampler };
37
+ }
38
+ if (endpoint) {
39
+ return {
40
+ enabled: true,
41
+ exporterMode: 'otlp',
42
+ endpoint,
43
+ headers: parseHeaders(process.env.OTEL_EXPORTER_OTLP_HEADERS),
44
+ recordContent,
45
+ serviceName,
46
+ sampler,
47
+ };
48
+ }
49
+ if (consoleFlag) {
50
+ return { enabled: true, exporterMode: 'console', recordContent, serviceName, sampler };
51
+ }
52
+ return { enabled: false, exporterMode: 'noop', recordContent, serviceName, sampler };
53
+ }
54
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmBH,SAAS,YAAY,CAAC,GAAuB;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,GAAG;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAC;IACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG,CAAC;IAC3D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,GAAG,CAAC;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,kBAAkB,CAAC;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAErE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,MAAM;YACpB,QAAQ;YACR,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;YAC7D,aAAa;YACb,WAAW;YACX,OAAO;SACR,CAAC;IACJ,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IACzF,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACvF,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Exporter factory — produces an OTel SpanExporter from a TelemetryConfig.
3
+ *
4
+ * The 'noop' branch is intentionally unreachable here: callers gate on
5
+ * config.enabled before constructing an exporter (see tracer.ts).
6
+ */
7
+ import { type SpanExporter } from '@opentelemetry/sdk-trace-base';
8
+ import type { TelemetryConfig } from './config.js';
9
+ export declare function buildExporter(config: TelemetryConfig): SpanExporter;
10
+ //# sourceMappingURL=exporters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporters.d.ts","sourceRoot":"","sources":["../../src/telemetry/exporters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAEvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAyBnD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CAYnE"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Exporter factory — produces an OTel SpanExporter from a TelemetryConfig.
3
+ *
4
+ * The 'noop' branch is intentionally unreachable here: callers gate on
5
+ * config.enabled before constructing an exporter (see tracer.ts).
6
+ */
7
+ import { ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';
8
+ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
9
+ /**
10
+ * Normalize an OTLP HTTP endpoint to include the `/v1/traces` signal path.
11
+ *
12
+ * The OTel JS SDK only auto-appends `/v1/traces` when reading the endpoint
13
+ * from the `OTEL_EXPORTER_OTLP_ENDPOINT` env var directly — not when the URL
14
+ * is passed via the exporter constructor. So `http://localhost:4318`
15
+ * silently 404s against any OTLP HTTP receiver. We append the suffix
16
+ * ourselves when the URL has no path component.
17
+ */
18
+ function normalizeOtlpEndpoint(endpoint) {
19
+ if (!endpoint)
20
+ return endpoint;
21
+ try {
22
+ const url = new URL(endpoint);
23
+ if (url.pathname === '' || url.pathname === '/') {
24
+ url.pathname = '/v1/traces';
25
+ return url.toString();
26
+ }
27
+ return endpoint;
28
+ }
29
+ catch {
30
+ return endpoint;
31
+ }
32
+ }
33
+ export function buildExporter(config) {
34
+ switch (config.exporterMode) {
35
+ case 'console':
36
+ return new ConsoleSpanExporter();
37
+ case 'otlp':
38
+ return new OTLPTraceExporter({
39
+ url: normalizeOtlpEndpoint(config.endpoint),
40
+ headers: config.headers,
41
+ });
42
+ case 'noop':
43
+ throw new Error('buildExporter called with noop mode — callers must gate on config.enabled');
44
+ }
45
+ }
46
+ //# sourceMappingURL=exporters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporters.js","sourceRoot":"","sources":["../../src/telemetry/exporters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAqB,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAG5E;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAAC,QAA4B;IACzD,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YAChD,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;YAC5B,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAuB;IACnD,QAAQ,MAAM,CAAC,YAAY,EAAE,CAAC;QAC5B,KAAK,SAAS;YACZ,OAAO,IAAI,mBAAmB,EAAE,CAAC;QACnC,KAAK,MAAM;YACT,OAAO,IAAI,iBAAiB,CAAC;gBAC3B,GAAG,EAAE,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAC3C,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;QACL,KAAK,MAAM;YACT,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IACjG,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Public telemetry barrel for `@esankhan3/anvil-agent-core`.
3
+ *
4
+ * Consumers import the GenAi attribute constants and (optionally) the tracer
5
+ * accessor. The wrapper that emits spans (Phase 2) is not yet exposed —
6
+ * instrumentation is applied internally at the registry seam.
7
+ */
8
+ export { getTracer, resetTracer, shutdownTracer, getTelemetryConfig } from './tracer.js';
9
+ export { recordGenAiCall, shutdownMetrics } from './metrics.js';
10
+ export type { GenAiCallMetrics } from './metrics.js';
11
+ export { loadTelemetryConfig } from './config.js';
12
+ export type { TelemetryConfig } from './config.js';
13
+ export { GenAi } from './attributes.js';
14
+ export type { GenAiAttribute } from './attributes.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Public telemetry barrel for `@esankhan3/anvil-agent-core`.
3
+ *
4
+ * Consumers import the GenAi attribute constants and (optionally) the tracer
5
+ * accessor. The wrapper that emits spans (Phase 2) is not yet exposed —
6
+ * instrumentation is applied internally at the registry seam.
7
+ */
8
+ export { getTracer, resetTracer, shutdownTracer, getTelemetryConfig } from './tracer.js';
9
+ export { recordGenAiCall, shutdownMetrics } from './metrics.js';
10
+ export { loadTelemetryConfig } from './config.js';
11
+ export { GenAi } from './attributes.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Instrumentation wrapper — wraps a ModelAdapter so its `run()` method
3
+ * emits an OpenTelemetry span following the GenAI semantic conventions.
4
+ *
5
+ * Phase 2 deviation from plan §2.2: the plan envisioned wrapping
6
+ * `LanguageModel.invoke` / `invokeStream`, but the seven existing adapters
7
+ * implement only the legacy `ModelAdapter.run(config, output)` interface
8
+ * today (see AGENT-CORE-ADR.md §9 Phase 5 deviation). This wrapper targets
9
+ * `run` instead — same integration seam (registry.get), same GenAI
10
+ * attributes emitted, lower fidelity (one span per stage run, not per
11
+ * turn). When adapters gain native `invoke()` impls, this file gains a
12
+ * sibling wrapper for that surface.
13
+ *
14
+ * Tool-call and reasoning child spans are deferred to Phase 3, where
15
+ * per-adapter NDJSON parsing surfaces them.
16
+ */
17
+ import type { ModelAdapter, ProviderName } from '../types.js';
18
+ /**
19
+ * Wrap a single-shot LLM call (e.g. runClaude / runGemini in single-shot.ts)
20
+ * with a `gen_ai.invoke` span. The callback receives the active span only
21
+ * for diagnostic logging; it is auto-`end()`-ed via try/finally.
22
+ */
23
+ export declare function withInvokeSpan<TResult>(args: {
24
+ provider: ProviderName | string;
25
+ model: string;
26
+ prompt?: string;
27
+ systemPrompt?: string;
28
+ }, exec: () => Promise<TResult>, applyResult: (result: TResult) => Record<string, number | string | boolean | undefined>): Promise<TResult>;
29
+ /**
30
+ * Return an instrumented view of the adapter. The new object delegates all
31
+ * methods to the wrapped instance; only `run` gets a span around it. When
32
+ * telemetry is disabled, OTel's no-op tracer makes the wrapper effectively
33
+ * free (no allocations beyond a closure).
34
+ */
35
+ export declare function instrumentModelAdapter(adapter: ModelAdapter): ModelAdapter;
36
+ //# sourceMappingURL=instrument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../../src/telemetry/instrument.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EACV,YAAY,EAGZ,YAAY,EAEb,MAAM,aAAa,CAAC;AAOrB;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAC1C,IAAI,EAAE;IACJ,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,EACD,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC5B,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GACtF,OAAO,CAAC,OAAO,CAAC,CAoClB;AAKD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAE1E"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Instrumentation wrapper — wraps a ModelAdapter so its `run()` method
3
+ * emits an OpenTelemetry span following the GenAI semantic conventions.
4
+ *
5
+ * Phase 2 deviation from plan §2.2: the plan envisioned wrapping
6
+ * `LanguageModel.invoke` / `invokeStream`, but the seven existing adapters
7
+ * implement only the legacy `ModelAdapter.run(config, output)` interface
8
+ * today (see AGENT-CORE-ADR.md §9 Phase 5 deviation). This wrapper targets
9
+ * `run` instead — same integration seam (registry.get), same GenAI
10
+ * attributes emitted, lower fidelity (one span per stage run, not per
11
+ * turn). When adapters gain native `invoke()` impls, this file gains a
12
+ * sibling wrapper for that surface.
13
+ *
14
+ * Tool-call and reasoning child spans are deferred to Phase 3, where
15
+ * per-adapter NDJSON parsing surfaces them.
16
+ */
17
+ import { SpanKind, SpanStatusCode } from '@opentelemetry/api';
18
+ import { getTracer } from './tracer.js';
19
+ import { loadTelemetryConfig } from './config.js';
20
+ import { GenAi } from './attributes.js';
21
+ import { recordGenAiCall } from './metrics.js';
22
+ import { calculateCostBreakdown } from '../cost.js';
23
+ /**
24
+ * Wrap a single-shot LLM call (e.g. runClaude / runGemini in single-shot.ts)
25
+ * with a `gen_ai.invoke` span. The callback receives the active span only
26
+ * for diagnostic logging; it is auto-`end()`-ed via try/finally.
27
+ */
28
+ export async function withInvokeSpan(args, exec, applyResult) {
29
+ const tracer = getTracer();
30
+ const telemetry = loadTelemetryConfig();
31
+ return tracer.startActiveSpan(SPAN_NAME, { kind: SpanKind.CLIENT }, async (span) => {
32
+ span.setAttributes({
33
+ [GenAi.SYSTEM]: args.provider,
34
+ [GenAi.REQUEST_MODEL]: args.model,
35
+ [GenAi.MESSAGES_COUNT]: args.systemPrompt ? 2 : 1,
36
+ });
37
+ if (telemetry.recordContent && args.prompt) {
38
+ span.setAttribute(GenAi.PROMPT, args.prompt.slice(0, PROMPT_TRUNCATE_BYTES));
39
+ }
40
+ try {
41
+ const result = await exec();
42
+ const attrs = applyResult(result);
43
+ for (const [k, v] of Object.entries(attrs)) {
44
+ if (v !== undefined)
45
+ span.setAttribute(k, v);
46
+ }
47
+ span.setStatus({ code: SpanStatusCode.OK });
48
+ return result;
49
+ }
50
+ catch (err) {
51
+ span.recordException(err);
52
+ span.setStatus({
53
+ code: SpanStatusCode.ERROR,
54
+ message: err instanceof Error ? err.message : String(err),
55
+ });
56
+ throw err;
57
+ }
58
+ finally {
59
+ span.end();
60
+ }
61
+ });
62
+ }
63
+ const SPAN_NAME = 'gen_ai.invoke';
64
+ const PROMPT_TRUNCATE_BYTES = 8192;
65
+ /**
66
+ * Return an instrumented view of the adapter. The new object delegates all
67
+ * methods to the wrapped instance; only `run` gets a span around it. When
68
+ * telemetry is disabled, OTel's no-op tracer makes the wrapper effectively
69
+ * free (no allocations beyond a closure).
70
+ */
71
+ export function instrumentModelAdapter(adapter) {
72
+ return new InstrumentedModelAdapter(adapter);
73
+ }
74
+ class InstrumentedModelAdapter {
75
+ inner;
76
+ constructor(inner) {
77
+ this.inner = inner;
78
+ }
79
+ get provider() {
80
+ return this.inner.provider;
81
+ }
82
+ get capabilities() {
83
+ return this.inner.capabilities;
84
+ }
85
+ supportsModel(modelId) {
86
+ return this.inner.supportsModel(modelId);
87
+ }
88
+ getModelPricing(modelId) {
89
+ return this.inner.getModelPricing(modelId);
90
+ }
91
+ checkAvailability() {
92
+ return this.inner.checkAvailability();
93
+ }
94
+ kill() {
95
+ this.inner.kill?.();
96
+ }
97
+ async run(config, output) {
98
+ const tracer = getTracer();
99
+ const telemetry = loadTelemetryConfig();
100
+ return tracer.startActiveSpan(SPAN_NAME, { kind: SpanKind.CLIENT }, async (span) => {
101
+ span.setAttributes({
102
+ [GenAi.SYSTEM]: this.inner.provider,
103
+ [GenAi.REQUEST_MODEL]: config.model,
104
+ [GenAi.MESSAGES_COUNT]: 1,
105
+ [GenAi.TOOLS_COUNT]: config.allowedTools?.length ?? 0,
106
+ 'anvil.stage': config.stage,
107
+ 'anvil.persona': config.persona,
108
+ 'anvil.session.resume': config.resume === true,
109
+ // Phase 9 — routing-decision attributes. Lets dashboards
110
+ // facet by routing tier and capability tier so users can
111
+ // tell at a glance how much work is going to local vs cloud.
112
+ 'anvil.provider.tier': this.inner.capabilities.tier,
113
+ 'anvil.provider.tool_use': this.inner.capabilities.toolUse,
114
+ ...(config.exclusiveSlot ? { 'anvil.local.exclusive_slot': true } : {}),
115
+ ...(config.toolExecutor ? { 'anvil.tool_executor.attached': true } : {}),
116
+ ...(typeof config.contextWindow === 'number'
117
+ ? { 'anvil.context_window': config.contextWindow }
118
+ : {}),
119
+ });
120
+ if (telemetry.recordContent) {
121
+ span.setAttribute(GenAi.PROMPT, config.userPrompt.slice(0, PROMPT_TRUNCATE_BYTES));
122
+ }
123
+ try {
124
+ const result = await this.inner.run(config, output);
125
+ // Compute the per-component breakdown from the central cost table.
126
+ // When the table doesn't know the model, breakdown.totalUsd is 0 —
127
+ // fall back to the adapter's costUsd so we never undercount in
128
+ // exported telemetry. (Decision O6: agent-core is the single source
129
+ // of truth, but only when it actually has data.)
130
+ const bd = calculateCostBreakdown(result.model, {
131
+ inputTokens: result.inputTokens,
132
+ outputTokens: result.outputTokens,
133
+ cacheReadTokens: result.cacheReadTokens,
134
+ cacheWriteTokens: result.cacheWriteTokens,
135
+ });
136
+ const totalUsd = bd.totalUsd > 0 ? bd.totalUsd : result.costUsd;
137
+ span.setAttributes({
138
+ [GenAi.USAGE_INPUT_TOKENS]: result.inputTokens,
139
+ [GenAi.USAGE_OUTPUT_TOKENS]: result.outputTokens,
140
+ [GenAi.USAGE_COST_USD]: totalUsd,
141
+ [GenAi.USAGE_COST_INPUT_USD]: bd.inputUsd,
142
+ [GenAi.USAGE_COST_OUTPUT_USD]: bd.outputUsd,
143
+ [GenAi.USAGE_COST_CACHE_READ_USD]: bd.cacheReadUsd,
144
+ [GenAi.USAGE_COST_CACHE_WRITE_USD]: bd.cacheWriteUsd,
145
+ [GenAi.RESPONSE_MODEL]: result.model,
146
+ 'anvil.duration_ms': result.durationMs,
147
+ });
148
+ if (result.sessionId) {
149
+ span.setAttribute(GenAi.RESPONSE_ID, result.sessionId);
150
+ }
151
+ // Phase 3 — cache + reasoning + tool-call enrichment from
152
+ // per-adapter response parsing. Adapters that don't surface these
153
+ // simply leave the fields undefined; we don't fabricate zeros for
154
+ // providers where the data isn't reported.
155
+ if (typeof result.cacheReadTokens === 'number') {
156
+ span.setAttribute(GenAi.USAGE_CACHE_READ_TOKENS, result.cacheReadTokens);
157
+ const denom = result.inputTokens + result.cacheReadTokens;
158
+ if (denom > 0) {
159
+ span.setAttribute(GenAi.USAGE_CACHE_HIT_RATIO, result.cacheReadTokens / denom);
160
+ }
161
+ }
162
+ if (typeof result.cacheWriteTokens === 'number') {
163
+ span.setAttribute(GenAi.USAGE_CACHE_WRITE_TOKENS, result.cacheWriteTokens);
164
+ }
165
+ if (typeof result.reasoningTokens === 'number' && result.reasoningTokens > 0) {
166
+ span.setAttribute(GenAi.REASONING_TOKENS, result.reasoningTokens);
167
+ }
168
+ if (typeof result.toolCallCount === 'number') {
169
+ span.setAttribute('gen_ai.response.tool_call_count', result.toolCallCount);
170
+ }
171
+ if (telemetry.recordContent) {
172
+ span.setAttribute(GenAi.COMPLETION, result.output.slice(0, PROMPT_TRUNCATE_BYTES));
173
+ }
174
+ // Mirror the span attrs into OTel metrics so Grafana can build
175
+ // counter/histogram dashboards. Failures here must not bubble —
176
+ // a metrics emit issue should never break the agent run.
177
+ try {
178
+ recordGenAiCall({
179
+ system: this.inner.provider,
180
+ requestModel: config.model,
181
+ responseModel: result.model,
182
+ stage: config.stage,
183
+ persona: config.persona,
184
+ inputTokens: result.inputTokens,
185
+ outputTokens: result.outputTokens,
186
+ cacheReadTokens: result.cacheReadTokens ?? 0,
187
+ cacheWriteTokens: result.cacheWriteTokens ?? 0,
188
+ reasoningTokens: result.reasoningTokens,
189
+ costInputUsd: bd.inputUsd,
190
+ costOutputUsd: bd.outputUsd,
191
+ costCacheReadUsd: bd.cacheReadUsd,
192
+ costCacheWriteUsd: bd.cacheWriteUsd,
193
+ costTotalUsd: totalUsd,
194
+ durationMs: result.durationMs ?? 0,
195
+ });
196
+ }
197
+ catch { /* never let metrics break a run */ }
198
+ span.setStatus({ code: SpanStatusCode.OK });
199
+ return result;
200
+ }
201
+ catch (err) {
202
+ span.recordException(err);
203
+ span.setStatus({
204
+ code: SpanStatusCode.ERROR,
205
+ message: err instanceof Error ? err.message : String(err),
206
+ });
207
+ throw err;
208
+ }
209
+ finally {
210
+ span.end();
211
+ }
212
+ });
213
+ }
214
+ }
215
+ //# sourceMappingURL=instrument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrument.js","sourceRoot":"","sources":["../../src/telemetry/instrument.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * GenAI metrics — emits OTel metrics on every adapter call alongside the
3
+ * existing trace span. Mirrors the OTel GenAI semconv counters/histograms
4
+ * so dashboards built against any compliant collector keep working.
5
+ *
6
+ * Instruments:
7
+ * - gen_ai.client.token.usage (counter, by io_type ∈ input|output|cache_read|cache_write|reasoning)
8
+ * - gen_ai.client.cost_usd (counter, by component ∈ input|output|cache_read|cache_write|total)
9
+ * - gen_ai.client.operation.duration (histogram, ms)
10
+ * - gen_ai.cache.hit_ratio (gauge per call, 0–1)
11
+ *
12
+ * All instruments inherit the shared resource (service.name, anvil.run_id,
13
+ * etc.) registered in tracer.ts. Metrics shipping is gated on the same
14
+ * TelemetryConfig as traces — disabled telemetry produces no-op meters.
15
+ */
16
+ export interface GenAiCallMetrics {
17
+ /** OTel `gen_ai.system` (provider) — e.g. 'claude', 'gemini'. */
18
+ system: string;
19
+ /** Model identifier sent in the request. */
20
+ requestModel: string;
21
+ /** Model identifier returned in the response (often resolved/aliased). */
22
+ responseModel?: string;
23
+ /** Anvil-specific labels — kept on metric attributes for slicing. */
24
+ stage?: string;
25
+ persona?: string;
26
+ inputTokens: number;
27
+ outputTokens: number;
28
+ cacheReadTokens: number;
29
+ cacheWriteTokens: number;
30
+ reasoningTokens?: number;
31
+ /** USD cost broken into components — every field is a delta to add. */
32
+ costInputUsd: number;
33
+ costOutputUsd: number;
34
+ costCacheReadUsd: number;
35
+ costCacheWriteUsd: number;
36
+ costTotalUsd: number;
37
+ /** Wall-clock duration of the call. */
38
+ durationMs: number;
39
+ }
40
+ /** Record one adapter call — emits all 4 instruments with consistent labels.
41
+ * Safe to call when telemetry is disabled (no-op meter eats the writes). */
42
+ export declare function recordGenAiCall(m: GenAiCallMetrics): void;
43
+ /** Force-flush any pending metric data and tear down the provider. */
44
+ export declare function shutdownMetrics(): Promise<void>;
45
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAwJH,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;4EAC4E;AAC5E,wBAAgB,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAsCzD;AAED,sEAAsE;AACtE,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAcrD"}