orbitx 0.2.5 → 0.2.7

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 (398) hide show
  1. package/dist/core/agent-providers.d.ts +15 -10
  2. package/dist/core/agent-providers.d.ts.map +1 -1
  3. package/dist/core/agent-providers.js +65 -15
  4. package/dist/core/agent-providers.js.map +1 -1
  5. package/dist/core/ai-provider.d.ts +61 -3
  6. package/dist/core/ai-provider.d.ts.map +1 -1
  7. package/dist/core/ai-provider.js.map +1 -1
  8. package/dist/core/anthropic-provider.d.ts +6 -1
  9. package/dist/core/anthropic-provider.d.ts.map +1 -1
  10. package/dist/core/anthropic-provider.js +165 -73
  11. package/dist/core/anthropic-provider.js.map +1 -1
  12. package/dist/core/base-agent.d.ts +21 -41
  13. package/dist/core/base-agent.d.ts.map +1 -1
  14. package/dist/core/base-agent.js +139 -140
  15. package/dist/core/base-agent.js.map +1 -1
  16. package/dist/core/deepseek-provider.d.ts +4 -1
  17. package/dist/core/deepseek-provider.d.ts.map +1 -1
  18. package/dist/core/deepseek-provider.js +103 -57
  19. package/dist/core/deepseek-provider.js.map +1 -1
  20. package/dist/core/mcp-client.d.ts +10 -2
  21. package/dist/core/mcp-client.d.ts.map +1 -1
  22. package/dist/core/mcp-client.js +28 -4
  23. package/dist/core/mcp-client.js.map +1 -1
  24. package/dist/core/mcp-fs-storage.d.ts.map +1 -1
  25. package/dist/core/mcp-fs-storage.js +2 -1
  26. package/dist/core/mcp-fs-storage.js.map +1 -1
  27. package/dist/core/mcp-server.d.ts +5 -1
  28. package/dist/core/mcp-server.d.ts.map +1 -1
  29. package/dist/core/mcp-server.js +31 -1
  30. package/dist/core/mcp-server.js.map +1 -1
  31. package/dist/core/mcp.d.ts +9 -23
  32. package/dist/core/mcp.d.ts.map +1 -1
  33. package/dist/core/mcp.js +1 -24
  34. package/dist/core/mcp.js.map +1 -1
  35. package/dist/core/ollama-provider.d.ts +4 -1
  36. package/dist/core/ollama-provider.d.ts.map +1 -1
  37. package/dist/core/ollama-provider.js +75 -38
  38. package/dist/core/ollama-provider.js.map +1 -1
  39. package/dist/core/openai-provider.d.ts +4 -1
  40. package/dist/core/openai-provider.d.ts.map +1 -1
  41. package/dist/core/openai-provider.js +90 -48
  42. package/dist/core/openai-provider.js.map +1 -1
  43. package/dist/core/retry.d.ts +1 -1
  44. package/dist/core/retry.d.ts.map +1 -1
  45. package/dist/core/retry.js +5 -1
  46. package/dist/core/retry.js.map +1 -1
  47. package/dist/core/skill.d.ts +2 -2
  48. package/dist/core/skill.d.ts.map +1 -1
  49. package/dist/index.d.ts +13 -20
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +9 -10
  52. package/dist/index.js.map +1 -1
  53. package/dist/templates/simple.d.ts +8 -12
  54. package/dist/templates/simple.d.ts.map +1 -1
  55. package/dist/templates/simple.js +6 -10
  56. package/dist/templates/simple.js.map +1 -1
  57. package/dist/tests/core/mcp-computer.test.js +26 -23
  58. package/dist/tests/core/mcp-computer.test.js.map +1 -1
  59. package/dist/tests/core/mcp-connection.test.js +23 -21
  60. package/dist/tests/core/mcp-connection.test.js.map +1 -1
  61. package/dist/tests/core/mcp-ipc-connection.test.js +30 -28
  62. package/dist/tests/core/mcp-ipc-connection.test.js.map +1 -1
  63. package/dist/tests/core/mcp-ws-connection.test.js +31 -30
  64. package/dist/tests/core/mcp-ws-connection.test.js.map +1 -1
  65. package/dist/tests/index.d.ts +27 -0
  66. package/dist/tests/index.d.ts.map +1 -1
  67. package/dist/tests/index.js +27 -0
  68. package/dist/tests/index.js.map +1 -1
  69. package/dist/tests/tools/agent/agent-tools.test.js +152 -147
  70. package/dist/tests/tools/agent/agent-tools.test.js.map +1 -1
  71. package/dist/tests/tools/bash/fixtures.d.ts +16 -0
  72. package/dist/tests/tools/bash/fixtures.d.ts.map +1 -0
  73. package/dist/tests/tools/bash/fixtures.js +22 -0
  74. package/dist/tests/tools/bash/fixtures.js.map +1 -0
  75. package/dist/tests/tools/bash/kill-tree.d.ts +21 -0
  76. package/dist/tests/tools/bash/kill-tree.d.ts.map +1 -0
  77. package/dist/tests/tools/bash/kill-tree.js +47 -0
  78. package/dist/tests/tools/bash/kill-tree.js.map +1 -0
  79. package/dist/tests/tools/bash/list.test.d.ts +2 -0
  80. package/dist/tests/tools/bash/list.test.d.ts.map +1 -0
  81. package/dist/tests/tools/bash/list.test.js +43 -0
  82. package/dist/tests/tools/bash/list.test.js.map +1 -0
  83. package/dist/tests/tools/bash/logs.test.d.ts +2 -0
  84. package/dist/tests/tools/bash/logs.test.d.ts.map +1 -0
  85. package/dist/tests/tools/bash/logs.test.js +48 -0
  86. package/dist/tests/tools/bash/logs.test.js.map +1 -0
  87. package/dist/tests/tools/bash/run.test.d.ts +2 -0
  88. package/dist/tests/tools/bash/run.test.d.ts.map +1 -0
  89. package/dist/tests/tools/bash/run.test.js +53 -0
  90. package/dist/tests/tools/bash/run.test.js.map +1 -0
  91. package/dist/tests/tools/bash/terminate.test.d.ts +2 -0
  92. package/dist/tests/tools/bash/terminate.test.d.ts.map +1 -0
  93. package/dist/tests/tools/bash/terminate.test.js +60 -0
  94. package/dist/tests/tools/bash/terminate.test.js.map +1 -0
  95. package/dist/tests/tools/bash/wait.test.d.ts +2 -0
  96. package/dist/tests/tools/bash/wait.test.d.ts.map +1 -0
  97. package/dist/tests/tools/bash/wait.test.js +45 -0
  98. package/dist/tests/tools/bash/wait.test.js.map +1 -0
  99. package/dist/tests/tools/bash/write-input.test.d.ts +2 -0
  100. package/dist/tests/tools/bash/write-input.test.d.ts.map +1 -0
  101. package/dist/tests/tools/bash/write-input.test.js +65 -0
  102. package/dist/tests/tools/bash/write-input.test.js.map +1 -0
  103. package/dist/tests/tools/browser/browser-tools.test.d.ts +2 -0
  104. package/dist/tests/tools/browser/browser-tools.test.d.ts.map +1 -0
  105. package/dist/tests/tools/browser/browser-tools.test.js +36 -0
  106. package/dist/tests/tools/browser/browser-tools.test.js.map +1 -0
  107. package/dist/tests/tools/fs/create-dir.test.d.ts +2 -0
  108. package/dist/tests/tools/fs/create-dir.test.d.ts.map +1 -0
  109. package/dist/tests/tools/fs/create-dir.test.js +37 -0
  110. package/dist/tests/tools/fs/create-dir.test.js.map +1 -0
  111. package/dist/tests/tools/fs/delete.test.d.ts +2 -0
  112. package/dist/tests/tools/fs/delete.test.d.ts.map +1 -0
  113. package/dist/tests/tools/fs/delete.test.js +69 -0
  114. package/dist/tests/tools/fs/delete.test.js.map +1 -0
  115. package/dist/tests/tools/fs/edit-file.test.d.ts +2 -0
  116. package/dist/tests/tools/fs/edit-file.test.d.ts.map +1 -0
  117. package/dist/tests/tools/fs/edit-file.test.js +103 -0
  118. package/dist/tests/tools/fs/edit-file.test.js.map +1 -0
  119. package/dist/tests/tools/fs/list-dir.test.d.ts +2 -0
  120. package/dist/tests/tools/fs/list-dir.test.d.ts.map +1 -0
  121. package/dist/tests/tools/fs/list-dir.test.js +65 -0
  122. package/dist/tests/tools/fs/list-dir.test.js.map +1 -0
  123. package/dist/tests/tools/fs/move.test.d.ts +2 -0
  124. package/dist/tests/tools/fs/move.test.d.ts.map +1 -0
  125. package/dist/tests/tools/fs/move.test.js +47 -0
  126. package/dist/tests/tools/fs/move.test.js.map +1 -0
  127. package/dist/tests/tools/fs/read-file.test.d.ts +2 -0
  128. package/dist/tests/tools/fs/read-file.test.d.ts.map +1 -0
  129. package/dist/tests/tools/fs/read-file.test.js +52 -0
  130. package/dist/tests/tools/fs/read-file.test.js.map +1 -0
  131. package/dist/tests/tools/fs/stat.test.d.ts +2 -0
  132. package/dist/tests/tools/fs/stat.test.d.ts.map +1 -0
  133. package/dist/tests/tools/fs/stat.test.js +43 -0
  134. package/dist/tests/tools/fs/stat.test.js.map +1 -0
  135. package/dist/tests/tools/fs/write-file.test.d.ts +2 -0
  136. package/dist/tests/tools/fs/write-file.test.d.ts.map +1 -0
  137. package/dist/tests/tools/fs/write-file.test.js +53 -0
  138. package/dist/tests/tools/fs/write-file.test.js.map +1 -0
  139. package/dist/tests/tools/present/add.test.d.ts +2 -0
  140. package/dist/tests/tools/present/add.test.d.ts.map +1 -0
  141. package/dist/tests/tools/present/add.test.js +51 -0
  142. package/dist/tests/tools/present/add.test.js.map +1 -0
  143. package/dist/tests/tools/present/clear.test.d.ts +2 -0
  144. package/dist/tests/tools/present/clear.test.d.ts.map +1 -0
  145. package/dist/tests/tools/present/clear.test.js +44 -0
  146. package/dist/tests/tools/present/clear.test.js.map +1 -0
  147. package/dist/tests/tools/present/get-list.test.d.ts +2 -0
  148. package/dist/tests/tools/present/get-list.test.d.ts.map +1 -0
  149. package/dist/tests/tools/present/get-list.test.js +50 -0
  150. package/dist/tests/tools/present/get-list.test.js.map +1 -0
  151. package/dist/tests/tools/question-answer/question-answer.test.d.ts +2 -0
  152. package/dist/tests/tools/question-answer/question-answer.test.d.ts.map +1 -0
  153. package/dist/tests/tools/question-answer/question-answer.test.js +24 -0
  154. package/dist/tests/tools/question-answer/question-answer.test.js.map +1 -0
  155. package/dist/tests/tools/todo/check-task.test.d.ts +2 -0
  156. package/dist/tests/tools/todo/check-task.test.d.ts.map +1 -0
  157. package/dist/tests/tools/todo/check-task.test.js +42 -0
  158. package/dist/tests/tools/todo/check-task.test.js.map +1 -0
  159. package/dist/tests/tools/todo/create-list.test.d.ts +2 -0
  160. package/dist/tests/tools/todo/create-list.test.d.ts.map +1 -0
  161. package/dist/tests/tools/todo/create-list.test.js +32 -0
  162. package/dist/tests/tools/todo/create-list.test.js.map +1 -0
  163. package/dist/tests/tools/todo/create-task.test.d.ts +2 -0
  164. package/dist/tests/tools/todo/create-task.test.d.ts.map +1 -0
  165. package/dist/tests/tools/todo/create-task.test.js +53 -0
  166. package/dist/tests/tools/todo/create-task.test.js.map +1 -0
  167. package/dist/tests/tools/todo/get-list.test.d.ts +2 -0
  168. package/dist/tests/tools/todo/get-list.test.d.ts.map +1 -0
  169. package/dist/tests/tools/todo/get-list.test.js +38 -0
  170. package/dist/tests/tools/todo/get-list.test.js.map +1 -0
  171. package/dist/tests/tools/todo/get-lists.test.d.ts +2 -0
  172. package/dist/tests/tools/todo/get-lists.test.d.ts.map +1 -0
  173. package/dist/tests/tools/todo/get-lists.test.js +29 -0
  174. package/dist/tests/tools/todo/get-lists.test.js.map +1 -0
  175. package/dist/tests/tools/todo/remove-list.test.d.ts +2 -0
  176. package/dist/tests/tools/todo/remove-list.test.d.ts.map +1 -0
  177. package/dist/tests/tools/todo/remove-list.test.js +41 -0
  178. package/dist/tests/tools/todo/remove-list.test.js.map +1 -0
  179. package/dist/tests/tools/todo/remove-task.test.d.ts +2 -0
  180. package/dist/tests/tools/todo/remove-task.test.d.ts.map +1 -0
  181. package/dist/tests/tools/todo/remove-task.test.js +45 -0
  182. package/dist/tests/tools/todo/remove-task.test.js.map +1 -0
  183. package/dist/tests/tools/utils/delay.test.js +26 -24
  184. package/dist/tests/tools/utils/delay.test.js.map +1 -1
  185. package/dist/tests/tools/utils/get-current-time.test.js +43 -41
  186. package/dist/tests/tools/utils/get-current-time.test.js.map +1 -1
  187. package/dist/tests/tools/utils/read-image.test.d.ts +2 -0
  188. package/dist/tests/tools/utils/read-image.test.d.ts.map +1 -0
  189. package/dist/tests/tools/utils/read-image.test.js +66 -0
  190. package/dist/tests/tools/utils/read-image.test.js.map +1 -0
  191. package/dist/tools/agent/hire.d.ts +1 -2
  192. package/dist/tools/agent/hire.d.ts.map +1 -1
  193. package/dist/tools/agent/hire.js +1 -4
  194. package/dist/tools/agent/hire.js.map +1 -1
  195. package/dist/tools/agent/index.d.ts +1 -3
  196. package/dist/tools/agent/index.d.ts.map +1 -1
  197. package/dist/tools/agent/index.js +0 -1
  198. package/dist/tools/agent/index.js.map +1 -1
  199. package/dist/tools/agent/list.d.ts +1 -1
  200. package/dist/tools/agent/list.d.ts.map +1 -1
  201. package/dist/tools/agent/prompt.d.ts +1 -2
  202. package/dist/tools/agent/prompt.d.ts.map +1 -1
  203. package/dist/tools/agent/prompt.js +11 -7
  204. package/dist/tools/agent/prompt.js.map +1 -1
  205. package/dist/tools/agent/report.d.ts +1 -1
  206. package/dist/tools/agent/report.d.ts.map +1 -1
  207. package/dist/tools/bash/index.d.ts +1 -3
  208. package/dist/tools/bash/index.d.ts.map +1 -1
  209. package/dist/tools/bash/index.js +0 -1
  210. package/dist/tools/bash/index.js.map +1 -1
  211. package/dist/tools/bash/list.d.ts +1 -1
  212. package/dist/tools/bash/list.d.ts.map +1 -1
  213. package/dist/tools/bash/list.js +1 -1
  214. package/dist/tools/bash/list.js.map +1 -1
  215. package/dist/tools/bash/logs.d.ts +1 -1
  216. package/dist/tools/bash/logs.d.ts.map +1 -1
  217. package/dist/tools/bash/logs.js +1 -1
  218. package/dist/tools/bash/logs.js.map +1 -1
  219. package/dist/tools/bash/run.d.ts +1 -2
  220. package/dist/tools/bash/run.d.ts.map +1 -1
  221. package/dist/tools/bash/run.js +1 -7
  222. package/dist/tools/bash/run.js.map +1 -1
  223. package/dist/tools/bash/terminate.d.ts +1 -2
  224. package/dist/tools/bash/terminate.d.ts.map +1 -1
  225. package/dist/tools/bash/terminate.js +1 -4
  226. package/dist/tools/bash/terminate.js.map +1 -1
  227. package/dist/tools/bash/wait.d.ts +1 -2
  228. package/dist/tools/bash/wait.d.ts.map +1 -1
  229. package/dist/tools/bash/wait.js +1 -7
  230. package/dist/tools/bash/wait.js.map +1 -1
  231. package/dist/tools/bash/write-input.d.ts +1 -2
  232. package/dist/tools/bash/write-input.d.ts.map +1 -1
  233. package/dist/tools/bash/write-input.js +1 -4
  234. package/dist/tools/bash/write-input.js.map +1 -1
  235. package/dist/tools/browser/click.d.ts +1 -2
  236. package/dist/tools/browser/click.d.ts.map +1 -1
  237. package/dist/tools/browser/click.js +1 -4
  238. package/dist/tools/browser/click.js.map +1 -1
  239. package/dist/tools/browser/console.d.ts +1 -1
  240. package/dist/tools/browser/console.d.ts.map +1 -1
  241. package/dist/tools/browser/create-session.d.ts +1 -2
  242. package/dist/tools/browser/create-session.d.ts.map +1 -1
  243. package/dist/tools/browser/create-session.js +1 -4
  244. package/dist/tools/browser/create-session.js.map +1 -1
  245. package/dist/tools/browser/fill.d.ts +1 -2
  246. package/dist/tools/browser/fill.d.ts.map +1 -1
  247. package/dist/tools/browser/fill.js +1 -4
  248. package/dist/tools/browser/fill.js.map +1 -1
  249. package/dist/tools/browser/get-sessions.d.ts +1 -1
  250. package/dist/tools/browser/get-sessions.d.ts.map +1 -1
  251. package/dist/tools/browser/index.d.ts +1 -3
  252. package/dist/tools/browser/index.d.ts.map +1 -1
  253. package/dist/tools/browser/index.js +0 -1
  254. package/dist/tools/browser/index.js.map +1 -1
  255. package/dist/tools/browser/inject.d.ts +1 -2
  256. package/dist/tools/browser/inject.d.ts.map +1 -1
  257. package/dist/tools/browser/inject.js +1 -4
  258. package/dist/tools/browser/inject.js.map +1 -1
  259. package/dist/tools/browser/navigate.d.ts +1 -2
  260. package/dist/tools/browser/navigate.d.ts.map +1 -1
  261. package/dist/tools/browser/navigate.js +1 -4
  262. package/dist/tools/browser/navigate.js.map +1 -1
  263. package/dist/tools/browser/network-status.d.ts +1 -1
  264. package/dist/tools/browser/network-status.d.ts.map +1 -1
  265. package/dist/tools/browser/network.d.ts +1 -1
  266. package/dist/tools/browser/network.d.ts.map +1 -1
  267. package/dist/tools/browser/read.d.ts +1 -2
  268. package/dist/tools/browser/read.d.ts.map +1 -1
  269. package/dist/tools/browser/read.js +1 -4
  270. package/dist/tools/browser/read.js.map +1 -1
  271. package/dist/tools/browser/remove-session.d.ts +1 -2
  272. package/dist/tools/browser/remove-session.d.ts.map +1 -1
  273. package/dist/tools/browser/remove-session.js +1 -4
  274. package/dist/tools/browser/remove-session.js.map +1 -1
  275. package/dist/tools/browser/screenshot.d.ts +1 -2
  276. package/dist/tools/browser/screenshot.d.ts.map +1 -1
  277. package/dist/tools/browser/screenshot.js +16 -15
  278. package/dist/tools/browser/screenshot.js.map +1 -1
  279. package/dist/tools/browser/scroll-info.d.ts +1 -1
  280. package/dist/tools/browser/scroll-info.d.ts.map +1 -1
  281. package/dist/tools/browser/scroll.d.ts +1 -2
  282. package/dist/tools/browser/scroll.d.ts.map +1 -1
  283. package/dist/tools/browser/scroll.js +1 -4
  284. package/dist/tools/browser/scroll.js.map +1 -1
  285. package/dist/tools/browser/submit-form.d.ts +1 -2
  286. package/dist/tools/browser/submit-form.d.ts.map +1 -1
  287. package/dist/tools/browser/submit-form.js +1 -4
  288. package/dist/tools/browser/submit-form.js.map +1 -1
  289. package/dist/tools/fs/create-dir.d.ts +1 -2
  290. package/dist/tools/fs/create-dir.d.ts.map +1 -1
  291. package/dist/tools/fs/create-dir.js +1 -4
  292. package/dist/tools/fs/create-dir.js.map +1 -1
  293. package/dist/tools/fs/delete.d.ts +1 -2
  294. package/dist/tools/fs/delete.d.ts.map +1 -1
  295. package/dist/tools/fs/delete.js +1 -4
  296. package/dist/tools/fs/delete.js.map +1 -1
  297. package/dist/tools/fs/edit-file.d.ts +1 -2
  298. package/dist/tools/fs/edit-file.d.ts.map +1 -1
  299. package/dist/tools/fs/edit-file.js +1 -4
  300. package/dist/tools/fs/edit-file.js.map +1 -1
  301. package/dist/tools/fs/index.d.ts +1 -3
  302. package/dist/tools/fs/index.d.ts.map +1 -1
  303. package/dist/tools/fs/index.js +0 -1
  304. package/dist/tools/fs/index.js.map +1 -1
  305. package/dist/tools/fs/list-dir.d.ts +1 -2
  306. package/dist/tools/fs/list-dir.d.ts.map +1 -1
  307. package/dist/tools/fs/list-dir.js +1 -4
  308. package/dist/tools/fs/list-dir.js.map +1 -1
  309. package/dist/tools/fs/move.d.ts +1 -2
  310. package/dist/tools/fs/move.d.ts.map +1 -1
  311. package/dist/tools/fs/move.js +1 -4
  312. package/dist/tools/fs/move.js.map +1 -1
  313. package/dist/tools/fs/read-file.d.ts +1 -2
  314. package/dist/tools/fs/read-file.d.ts.map +1 -1
  315. package/dist/tools/fs/read-file.js +1 -4
  316. package/dist/tools/fs/read-file.js.map +1 -1
  317. package/dist/tools/fs/stat.d.ts +1 -2
  318. package/dist/tools/fs/stat.d.ts.map +1 -1
  319. package/dist/tools/fs/stat.js +1 -4
  320. package/dist/tools/fs/stat.js.map +1 -1
  321. package/dist/tools/fs/write-file.d.ts +1 -2
  322. package/dist/tools/fs/write-file.d.ts.map +1 -1
  323. package/dist/tools/fs/write-file.js +1 -4
  324. package/dist/tools/fs/write-file.js.map +1 -1
  325. package/dist/tools/present/add.d.ts +1 -2
  326. package/dist/tools/present/add.d.ts.map +1 -1
  327. package/dist/tools/present/add.js +1 -4
  328. package/dist/tools/present/add.js.map +1 -1
  329. package/dist/tools/present/clear.d.ts +1 -2
  330. package/dist/tools/present/clear.d.ts.map +1 -1
  331. package/dist/tools/present/clear.js +1 -4
  332. package/dist/tools/present/clear.js.map +1 -1
  333. package/dist/tools/present/get-list.d.ts +1 -2
  334. package/dist/tools/present/get-list.d.ts.map +1 -1
  335. package/dist/tools/present/get-list.js +0 -2
  336. package/dist/tools/present/get-list.js.map +1 -1
  337. package/dist/tools/present/index.d.ts +1 -3
  338. package/dist/tools/present/index.d.ts.map +1 -1
  339. package/dist/tools/present/index.js +0 -1
  340. package/dist/tools/present/index.js.map +1 -1
  341. package/dist/tools/question-answer/index.d.ts +1 -3
  342. package/dist/tools/question-answer/index.d.ts.map +1 -1
  343. package/dist/tools/question-answer/index.js +0 -1
  344. package/dist/tools/question-answer/index.js.map +1 -1
  345. package/dist/tools/question-answer/question-answer.d.ts +1 -2
  346. package/dist/tools/question-answer/question-answer.d.ts.map +1 -1
  347. package/dist/tools/question-answer/question-answer.js +1 -4
  348. package/dist/tools/question-answer/question-answer.js.map +1 -1
  349. package/dist/tools/todo/check-task.d.ts +1 -2
  350. package/dist/tools/todo/check-task.d.ts.map +1 -1
  351. package/dist/tools/todo/check-task.js +1 -4
  352. package/dist/tools/todo/check-task.js.map +1 -1
  353. package/dist/tools/todo/create-list.d.ts +1 -2
  354. package/dist/tools/todo/create-list.d.ts.map +1 -1
  355. package/dist/tools/todo/create-list.js +1 -4
  356. package/dist/tools/todo/create-list.js.map +1 -1
  357. package/dist/tools/todo/create-task.d.ts +1 -2
  358. package/dist/tools/todo/create-task.d.ts.map +1 -1
  359. package/dist/tools/todo/create-task.js +1 -4
  360. package/dist/tools/todo/create-task.js.map +1 -1
  361. package/dist/tools/todo/get-list.d.ts +1 -1
  362. package/dist/tools/todo/get-list.d.ts.map +1 -1
  363. package/dist/tools/todo/get-list.js +1 -1
  364. package/dist/tools/todo/get-list.js.map +1 -1
  365. package/dist/tools/todo/get-lists.d.ts +1 -1
  366. package/dist/tools/todo/get-lists.d.ts.map +1 -1
  367. package/dist/tools/todo/get-lists.js +1 -1
  368. package/dist/tools/todo/get-lists.js.map +1 -1
  369. package/dist/tools/todo/index.d.ts +1 -3
  370. package/dist/tools/todo/index.d.ts.map +1 -1
  371. package/dist/tools/todo/index.js +0 -1
  372. package/dist/tools/todo/index.js.map +1 -1
  373. package/dist/tools/todo/remove-list.d.ts +1 -2
  374. package/dist/tools/todo/remove-list.d.ts.map +1 -1
  375. package/dist/tools/todo/remove-list.js +1 -4
  376. package/dist/tools/todo/remove-list.js.map +1 -1
  377. package/dist/tools/todo/remove-task.d.ts +1 -2
  378. package/dist/tools/todo/remove-task.d.ts.map +1 -1
  379. package/dist/tools/todo/remove-task.js +1 -4
  380. package/dist/tools/todo/remove-task.js.map +1 -1
  381. package/dist/tools/utils/delay.d.ts +1 -1
  382. package/dist/tools/utils/delay.d.ts.map +1 -1
  383. package/dist/tools/utils/get-current-time.d.ts +1 -1
  384. package/dist/tools/utils/get-current-time.d.ts.map +1 -1
  385. package/dist/tools/utils/index.d.ts +1 -1
  386. package/dist/tools/utils/index.d.ts.map +1 -1
  387. package/dist/tools/utils/read-image.d.ts +12 -7
  388. package/dist/tools/utils/read-image.d.ts.map +1 -1
  389. package/dist/tools/utils/read-image.js +27 -17
  390. package/dist/tools/utils/read-image.js.map +1 -1
  391. package/docs/agents.md +57 -26
  392. package/docs/api-reference.md +12 -13
  393. package/docs/getting-started.md +2 -2
  394. package/docs/mcp-architecture.md +15 -3
  395. package/docs/providers.md +119 -16
  396. package/docs/streaming.md +19 -2
  397. package/docs/tools.md +41 -8
  398. package/package.json +1 -1
@@ -1,16 +1,21 @@
1
- import type { AIProvider } from "./ai-provider.js";
2
- export type AgentProviderRole = "main" | "image";
1
+ import type { AIProvider, ProviderType } from "./ai-provider.js";
3
2
  export interface AgentProviderEntry {
4
- aiProvider: AIProvider;
5
- type: AgentProviderRole;
3
+ type: ProviderType;
4
+ provider: AIProvider | AIProvider[];
5
+ default?: number;
6
6
  }
7
7
  export type AgentProvidersInput = AIProvider | AgentProviderEntry[];
8
- export interface ResolvedAgentProviders {
9
- main: AIProvider;
10
- /** Present only if a provider was assigned the "image" role, or (single-provider case) the one provider supports images. */
11
- image?: AIProvider;
8
+ interface ProviderPool {
9
+ providers: AIProvider[];
10
+ default: number;
12
11
  }
13
- /** Only two provider roles exist: "main" (the agent loop itself) and "image" (describing/handling image tool output). There is no separate "utils" provider — all skills and tools are always included in the system prompt from the start, so there's nothing left for a utils pass to decide. */
14
- export declare function resolveAgentProviders(input: AgentProvidersInput): ResolvedAgentProviders;
12
+ export declare class ProviderRegistry {
13
+ #private;
14
+ constructor(byType: Map<ProviderType, ProviderPool>);
15
+ getMain(): AIProvider;
16
+ getProvider(type: ProviderType): AIProvider | undefined;
17
+ getProviders(type: ProviderType): AIProvider[] | undefined;
18
+ }
19
+ export declare function resolveAgentProviders(input: AgentProvidersInput): ProviderRegistry;
15
20
  export default resolveAgentProviders;
16
21
  //# sourceMappingURL=agent-providers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-providers.d.ts","sourceRoot":"","sources":["../../src/core/agent-providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,kBAAkB,EAAE,CAAC;AAEpE,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,4HAA4H;IAC5H,KAAK,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,mSAAmS;AACnS,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,sBAAsB,CAoBxF;AAED,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"agent-providers.d.ts","sourceRoot":"","sources":["../../src/core/agent-providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAwB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEvF,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,kBAAkB,EAAE,CAAC;AAEpE,UAAU,YAAY;IAClB,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACnB;AAwBD,qBAAa,gBAAgB;;gBAGb,MAAM,EAAE,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC;IAInD,OAAO,IAAI,UAAU;IAIrB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS;IAkBvD,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,EAAE,GAAG,SAAS;CAG7D;AAWD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,gBAAgB,CAclF;AAED,eAAe,qBAAqB,CAAC"}
@@ -1,21 +1,71 @@
1
- /** Only two provider roles exist: "main" (the agent loop itself) and "image" (describing/handling image tool output). There is no separate "utils" provider — all skills and tools are always included in the system prompt from the start, so there's nothing left for a utils pass to decide. */
2
- export function resolveAgentProviders(input) {
3
- if (!Array.isArray(input)) {
4
- const caps = input.getCapabilities();
5
- return {
6
- main: input,
7
- image: caps.supportsImages ? input : undefined,
8
- };
1
+ /**
2
+ * Maps the well-known `ProviderType` role names onto the `ProviderCapabilities`
3
+ * flag that actually describes that ability — used only as a fallback when
4
+ * nothing is registered under the role itself (see `getProvider` below).
5
+ * Role names with no capability equivalent (`main`, `llm-low`/`medium`/`high`,
6
+ * any custom string) simply aren't listed here, so the fallback never applies
7
+ * to them.
8
+ */
9
+ const CAPABILITY_BY_TYPE = {
10
+ "image-describer": "supportsImages",
11
+ "image-generation": "supportsImageGeneration",
12
+ "image-editing": "supportsImageEditing",
13
+ "video-describer": "supportsVideo",
14
+ "video-generation": "supportsVideoGeneration",
15
+ "video-editing": "supportsVideoEditing",
16
+ "audio-describer": "supportsAudio",
17
+ "audio-generation": "supportsAudioGeneration",
18
+ "audio-design": "supportsAudioDesign",
19
+ "audio-clone": "supportsAudioClone",
20
+ "3d-model-generator": "supports3DModelGeneration",
21
+ };
22
+ export class ProviderRegistry {
23
+ #byType;
24
+ constructor(byType) {
25
+ this.#byType = byType;
26
+ }
27
+ getMain() {
28
+ return this.#byType.get("main").providers[this.#byType.get("main").default];
29
+ }
30
+ getProvider(type) {
31
+ const pool = this.#byType.get(type);
32
+ if (pool)
33
+ return pool.providers[pool.default];
34
+ const capabilityKey = CAPABILITY_BY_TYPE[type];
35
+ if (!capabilityKey)
36
+ return undefined;
37
+ for (const otherPool of this.#byType.values()) {
38
+ for (const provider of otherPool.providers) {
39
+ if (provider.getCapabilities()[capabilityKey]) {
40
+ return provider;
41
+ }
42
+ }
43
+ }
44
+ return undefined;
9
45
  }
10
- const mainEntry = input.find(e => e.type === "main");
11
- if (!mainEntry) {
46
+ getProviders(type) {
47
+ return this.#byType.get(type)?.providers;
48
+ }
49
+ }
50
+ function toPool(entry) {
51
+ const providers = Array.isArray(entry.provider) ? entry.provider : [entry.provider];
52
+ const defaultIndex = entry.default ?? 0;
53
+ if (defaultIndex < 0 || defaultIndex >= providers.length) {
54
+ throw new Error(`resolveAgentProviders: entry "${entry.type}" has default=${defaultIndex}, out of range for its ${providers.length}-provider pool.`);
55
+ }
56
+ return { providers, default: defaultIndex };
57
+ }
58
+ export function resolveAgentProviders(input) {
59
+ const entries = Array.isArray(input) ? input : [{ type: "main", provider: input }];
60
+ const mainEntries = entries.filter(e => e.type === "main");
61
+ if (mainEntries.length === 0) {
12
62
  throw new Error("resolveAgentProviders: a provider with type \"main\" is required when passing an array of providers.");
13
63
  }
14
- const imageEntry = input.find(e => e.type === "image");
15
- return {
16
- main: mainEntry.aiProvider,
17
- image: imageEntry?.aiProvider,
18
- };
64
+ const byType = new Map();
65
+ for (const entry of entries) {
66
+ byType.set(entry.type, toPool(entry));
67
+ }
68
+ return new ProviderRegistry(byType);
19
69
  }
20
70
  export default resolveAgentProviders;
21
71
  //# sourceMappingURL=agent-providers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-providers.js","sourceRoot":"","sources":["../../src/core/agent-providers.ts"],"names":[],"mappings":"AAiBA,mSAAmS;AACnS,MAAM,UAAU,qBAAqB,CAAC,KAA0B;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;QACrC,OAAO;YACH,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACjD,CAAC;IACN,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sGAAsG,CAAC,CAAC;IAC5H,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAEvD,OAAO;QACH,IAAI,EAAE,SAAS,CAAC,UAAU;QAC1B,KAAK,EAAE,UAAU,EAAE,UAAU;KAChC,CAAC;AACN,CAAC;AAED,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"agent-providers.js","sourceRoot":"","sources":["../../src/core/agent-providers.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,20 @@ export type MessageContentPart = {
31
31
  image: string;
32
32
  mimeType?: string;
33
33
  };
34
+ export type ProviderType = "main" | "image-describer" | "image-generation" | "image-editing" | "video-describer" | "video-generation" | "video-editing" | "audio-describer" | "audio-generation" | "audio-design" | "audio-clone" | "3d-model-generator" | "llm-low" | "llm-medium" | "llm-high" | (string & {});
35
+ export interface MessageUsageTokens {
36
+ type: ProviderType;
37
+ unit: "tokens";
38
+ inputMissTokens: number;
39
+ inputCacheTokens: number;
40
+ outputTokens: number;
41
+ }
42
+ export interface MessageUsageCost {
43
+ type: ProviderType;
44
+ unit: "cost";
45
+ cost: number;
46
+ }
47
+ export type MessageUsage = MessageUsageTokens | MessageUsageCost;
34
48
  export interface Message {
35
49
  role: "user" | "system" | "assistant" | "tool";
36
50
  content?: string;
@@ -52,11 +66,17 @@ export interface Message {
52
66
  * untouched; only the provider that produced it interprets it.
53
67
  */
54
68
  providerThinking?: any[];
69
+ timestamp?: number;
70
+ /** True on messages BaseAgent injects itself rather than ones a human or the model produced (e.g. the forced-compaction nudge) — a hint for UI code to filter out of what's shown to an end user. Defaults to false/absent; purely a display hint, not sent to any provider. */
71
+ hidden?: boolean;
72
+ usage?: MessageUsage[];
55
73
  }
56
74
  export interface ChatResponse {
57
75
  content: string;
58
- inputTokens: number;
59
- outputTokens: number;
76
+ inputMissTokens?: number;
77
+ inputCacheTokens?: number;
78
+ outputTokens?: number;
79
+ cost?: number;
60
80
  /** Native tool calls requested by the model, when the provider supports native tool-calling and tools were supplied. */
61
81
  toolCalls?: ToolCallRequest[];
62
82
  /** Accumulated reasoning/thinking text produced this turn, when thinking was requested and the provider can surface it. See `Message.thinking`. */
@@ -88,6 +108,13 @@ export type StreamCallback = (chunk: {
88
108
  toolName?: string;
89
109
  /** Reasoning/thinking text delta for this chunk, mirroring `content` — present only while the model is thinking, absent (or empty) once it moves on to its actual answer. Only ever set on non-`done` assistant chunks. Never set unless the provider was configured with `thinkEffort` and can stream thinking (see `ProviderCapabilities.supportsThinking`); when a thinking chunk is emitted, `content` on that same chunk is empty. */
90
110
  thinking?: string;
111
+ /** Mirrors `Message.hidden` — true on chunks for a message BaseAgent injected itself (e.g. the forced-compaction nudge), so a live-streaming UI can filter it out the same way it would filter the persisted Message. */
112
+ hidden?: boolean;
113
+ usage?: {
114
+ inputMissTokens: number;
115
+ inputCacheTokens: number;
116
+ outputTokens: number;
117
+ };
91
118
  }) => Promise<void> | void;
92
119
  /**
93
120
  * Static capability + limits description for a provider/model pair. This
@@ -103,15 +130,46 @@ export interface ProviderCapabilities {
103
130
  supportsImages: boolean;
104
131
  /** The model's total context window, in tokens. Used to derive a safe default for when to trigger a memory-compaction event, without needing a hardcoded per-agent constant. */
105
132
  contextWindow: number;
133
+ /** The model's maximum output tokens per response, when known. Not yet enforced anywhere — reserved for the agent loop to size/guard its own output budgeting in a future release. Undefined where not confirmed for a given provider/model. */
134
+ maxOutputTokens?: number;
106
135
  /** Fraction of the context window (0-1) that's safe to fill before compacting; leaves headroom for the system prompt, tool schema, and the model's own output. Defaults applied by callers if not specified. */
107
136
  safeUsageRatio?: number;
108
137
  /** Whether this provider can surface the model's reasoning/thinking text (streamed via the `thinking` chunk field, and returned as `ChatResponse.thinking`) when constructed with `thinkEffort`. A provider may still accept/honor `thinkEffort` server-side (e.g. it changes response quality/latency) while reporting `false` here, if its API never exposes the reasoning text itself. */
109
138
  supportsThinking?: boolean;
139
+ /** Whether this provider/model accepts video content in messages. */
140
+ supportsVideo?: boolean;
141
+ /** Whether this provider/model accepts audio content in messages. */
142
+ supportsAudio?: boolean;
143
+ /** Whether this provider/model can generate new images. */
144
+ supportsImageGeneration?: boolean;
145
+ /** Whether this provider/model can edit an existing image. */
146
+ supportsImageEditing?: boolean;
147
+ /** Whether this provider/model can generate new video. */
148
+ supportsVideoGeneration?: boolean;
149
+ /** Whether this provider/model can edit existing video. */
150
+ supportsVideoEditing?: boolean;
151
+ /** Whether this provider/model can generate new audio (speech, music, sound effects). */
152
+ supportsAudioGeneration?: boolean;
153
+ /** Whether this provider/model can design/produce sound effects or soundscapes. */
154
+ supportsAudioDesign?: boolean;
155
+ /** Whether this provider/model can clone a voice from a reference sample. */
156
+ supportsAudioClone?: boolean;
157
+ /** Whether this provider/model can generate a new 3D model. */
158
+ supports3DModelGeneration?: boolean;
110
159
  }
111
160
  export declare abstract class AIProvider {
112
- abstract chat(messages: Message[], streamCallback?: StreamCallback, tools?: ToolSchema[]): Promise<ChatResponse>;
161
+ /**
162
+ * @param signal When provided and later aborted, the in-flight request to the underlying
163
+ * provider API is cancelled immediately (not just abandoned client-side) — used by
164
+ * `BaseAgent.immediateStop()` to cut off a call's cost/token usage right away instead of
165
+ * waiting for it to finish. Providers built on fetch-based SDKs (Anthropic, OpenAI,
166
+ * DeepSeek) honor this for both streaming and non-streaming calls; Ollama's client only
167
+ * supports it for streaming calls (see ollama-provider.ts).
168
+ */
169
+ abstract chat(messages: Message[], streamCallback?: StreamCallback, tools?: ToolSchema[], signal?: AbortSignal): Promise<ChatResponse>;
113
170
  /** Describe what this provider/model can do — used by BaseAgent to pick the native-tools vs. legacy-JSON path and to size the memory-compaction threshold. */
114
171
  abstract getCapabilities(): ProviderCapabilities;
172
+ abstract setOption(key: string, value: unknown): void;
115
173
  }
116
174
  export default AIProvider;
117
175
  //# sourceMappingURL=ai-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-provider.d.ts","sourceRoot":"","sources":["../../src/core/ai-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-provider.d.ts","sourceRoot":"","sources":["../../src/core/ai-provider.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ai-provider.js","sourceRoot":"","sources":["../../src/core/ai-provider.ts"],"names":[],"mappings":"AAgHA,MAAM,OAAgB,UAAU;CAS/B;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ai-provider.js","sourceRoot":"","sources":["../../src/core/ai-provider.ts"],"names":[],"mappings":"AAqLA,MAAM,OAAgB,UAAU;CAoB/B;AAED,eAAe,UAAU,CAAC"}
@@ -8,9 +8,14 @@ export declare class AnthropicProvider extends AIProvider {
8
8
  contextWindow?: number;
9
9
  maxTokens?: number;
10
10
  thinkEffort?: number;
11
+ userId?: string;
12
+ disablePromptCaching?: boolean;
13
+ extendedContext?: boolean | string;
11
14
  });
12
15
  getCapabilities(): ProviderCapabilities;
13
- chat(messages: Message[], streamCallback?: StreamCallback, tools?: ToolSchema[]): Promise<ChatResponse>;
16
+ /** Settable without reconstructing this provider: `thinkEffort`, `userId`, `disablePromptCaching`, `maxTokens`, `supportsTools` — every one of these is read fresh from the corresponding private field on every `chat()` call, never baked into derived state at construction (unlike `contextWindow`/`extendedContext`, which are out of scope here). */
17
+ setOption(key: string, value: unknown): void;
18
+ chat(messages: Message[], streamCallback?: StreamCallback, tools?: ToolSchema[], signal?: AbortSignal): Promise<ChatResponse>;
14
19
  }
15
20
  export default AnthropicProvider;
16
21
  //# sourceMappingURL=anthropic-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../src/core/anthropic-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAmB,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACjI,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAyH1C,qBAAa,iBAAkB,SAAQ,UAAU;;gBAUjC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAA0B,EAAE,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAWpM,eAAe,IAAI,oBAAoB;IAUjC,IAAI,CACN,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,CAAC,EAAE,cAAc,EAC/B,KAAK,CAAC,EAAE,UAAU,EAAE,GACrB,OAAO,CAAC,YAAY,CAAC;CAgJ3B;AAED,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../src/core/anthropic-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAmB,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACjI,OAAO,UAAU,MAAM,kBAAkB,CAAC;AA0J1C,qBAAa,iBAAkB,SAAQ,UAAU;;gBAcjC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAA0B,EAAE,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;KAAO;IAazR,eAAe,IAAI,oBAAoB;IAqBvC,2VAA2V;IAC3V,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAWtC,IAAI,CACN,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,CAAC,EAAE,cAAc,EAC/B,KAAK,CAAC,EAAE,UAAU,EAAE,EACpB,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,YAAY,CAAC;CAwK3B;AAED,eAAe,iBAAiB,CAAC"}
@@ -3,13 +3,33 @@ import AIProvider from "./ai-provider.js";
3
3
  import { toAnthropicTools } from "./tool-schema-translator.js";
4
4
  import { withRetry } from "./retry.js";
5
5
  const MODEL_CONTEXT_WINDOWS = {
6
- "claude-opus-4-8": 200_000,
7
- "claude-sonnet-5": 200_000,
6
+ "claude-opus-5": 1_000_000,
7
+ "claude-sonnet-5": 1_000_000,
8
+ "claude-fable-5": 1_000_000,
9
+ "claude-opus-4-8": 1_000_000,
10
+ "claude-opus-4-7": 1_000_000,
11
+ "claude-opus-4-6": 1_000_000,
12
+ "claude-sonnet-4-6": 1_000_000,
13
+ "claude-opus-4-5": 200_000,
14
+ "claude-sonnet-4-5": 200_000,
8
15
  "claude-haiku-4-5-20251001": 200_000,
9
- "claude-fable-5": 200_000,
10
- "claude-mythos-5": 200_000,
16
+ "claude-mythos-5": 1_000_000,
11
17
  };
12
18
  const DEFAULT_CONTEXT_WINDOW = 200_000;
19
+ const MODEL_MAX_OUTPUT_TOKENS = {
20
+ "claude-fable-5": 128_000,
21
+ "claude-mythos-5": 128_000,
22
+ "claude-opus-5": 128_000,
23
+ "claude-sonnet-5": 128_000,
24
+ "claude-opus-4-8": 128_000,
25
+ "claude-opus-4-7": 128_000,
26
+ "claude-opus-4-6": 128_000,
27
+ "claude-sonnet-4-6": 128_000,
28
+ "claude-opus-4-5": 64_000,
29
+ "claude-sonnet-4-5": 64_000,
30
+ "claude-haiku-4-5-20251001": 64_000,
31
+ };
32
+ const DEFAULT_MAX_OUTPUT_TOKENS = 128_000;
13
33
  // Anthropic's extended thinking takes a numeric token budget rather than a
14
34
  // low/medium/high enum, so the universal 0-1 `thinkEffort` is mapped onto a
15
35
  // budget range instead of going through resolveThinkEffortLevel(). The
@@ -82,6 +102,19 @@ function toAnthropicMessages(messages) {
82
102
  }
83
103
  return { system: systemParts.join("\n\n"), messages: out };
84
104
  }
105
+ function withCacheControl(messages) {
106
+ if (messages.length === 0)
107
+ return messages;
108
+ const last = messages[messages.length - 1];
109
+ const content = typeof last.content === "string"
110
+ ? [{ type: "text", text: last.content }]
111
+ : [...last.content];
112
+ if (content.length === 0)
113
+ return messages;
114
+ const lastIndex = content.length - 1;
115
+ content[lastIndex] = { ...content[lastIndex], cache_control: { type: "ephemeral" } };
116
+ return [...messages.slice(0, -1), { ...last, content }];
117
+ }
85
118
  function fromAnthropicToolCalls(content) {
86
119
  if (!content)
87
120
  return undefined;
@@ -123,30 +156,71 @@ export class AnthropicProvider extends AIProvider {
123
156
  #maxTokens;
124
157
  /** Universal 0-1 thinking effort — see src/core/think-effort.ts. Mapped onto Anthropic's numeric thinking-token budget in #chat. */
125
158
  #thinkEffort;
159
+ /** Opaque end-user identifier forwarded as `metadata.user_id` on every request, for Anthropic's own abuse-monitoring — see docs/providers.md#user-tracking. */
160
+ #userId;
161
+ /** Ephemeral cache_control breakpoint on by default (see withCacheControl) — set true to send every request uncached. */
162
+ #disablePromptCaching;
126
163
  constructor(apiKey, model = "claude-sonnet-5", options = {}) {
127
164
  super();
128
165
  this.#client = new Anthropic({ apiKey });
129
166
  this.#model = model;
130
167
  this.#supportsTools = options.supportsTools ?? true;
131
168
  this.#supportsImages = options.supportsImages ?? true;
132
- this.#contextWindow = options.contextWindow ?? MODEL_CONTEXT_WINDOWS[model] ?? DEFAULT_CONTEXT_WINDOW;
169
+ this.#contextWindow = options.contextWindow ?? (MODEL_CONTEXT_WINDOWS[model] ?? DEFAULT_CONTEXT_WINDOW);
133
170
  this.#maxTokens = options.maxTokens ?? 4096;
134
171
  this.#thinkEffort = options.thinkEffort;
172
+ this.#userId = options.userId;
173
+ this.#disablePromptCaching = options.disablePromptCaching ?? false;
135
174
  }
136
175
  getCapabilities() {
137
176
  return {
138
177
  supportsTools: this.#supportsTools,
139
178
  supportsImages: this.#supportsImages,
140
179
  contextWindow: this.#contextWindow,
141
- safeUsageRatio: 0.5,
180
+ safeUsageRatio: 0.7,
142
181
  supportsThinking: true,
182
+ maxOutputTokens: MODEL_MAX_OUTPUT_TOKENS[this.#model] ?? DEFAULT_MAX_OUTPUT_TOKENS,
183
+ supportsVideo: false,
184
+ supportsAudio: false,
185
+ supportsImageGeneration: false,
186
+ supportsImageEditing: false,
187
+ supportsVideoGeneration: false,
188
+ supportsVideoEditing: false,
189
+ supportsAudioGeneration: false,
190
+ supportsAudioDesign: false,
191
+ supportsAudioClone: false,
192
+ supports3DModelGeneration: false,
143
193
  };
144
194
  }
145
- async chat(messages, streamCallback, tools) {
146
- const { system, messages: formattedMessages } = toAnthropicMessages(messages);
195
+ /** Settable without reconstructing this provider: `thinkEffort`, `userId`, `disablePromptCaching`, `maxTokens`, `supportsTools` — every one of these is read fresh from the corresponding private field on every `chat()` call, never baked into derived state at construction (unlike `contextWindow`/`extendedContext`, which are out of scope here). */
196
+ setOption(key, value) {
197
+ switch (key) {
198
+ case "thinkEffort":
199
+ this.#thinkEffort = value;
200
+ return;
201
+ case "userId":
202
+ this.#userId = value;
203
+ return;
204
+ case "disablePromptCaching":
205
+ this.#disablePromptCaching = value;
206
+ return;
207
+ case "maxTokens":
208
+ this.#maxTokens = value;
209
+ return;
210
+ case "supportsTools":
211
+ this.#supportsTools = value;
212
+ return;
213
+ default: throw new Error(`AnthropicProvider does not support setting option "${key}"`);
214
+ }
215
+ }
216
+ async chat(messages, streamCallback, tools, signal) {
217
+ const { system, messages: rawFormattedMessages } = toAnthropicMessages(messages);
218
+ const formattedMessages = this.#disablePromptCaching ? rawFormattedMessages : withCacheControl(rawFormattedMessages);
147
219
  const formattedTools = tools && tools.length > 0 && this.#supportsTools
148
220
  ? toAnthropicTools(tools)
149
221
  : undefined;
222
+ const metadataParam = this.#userId ? { metadata: { user_id: this.#userId } } : {};
223
+ const requestOptions = { signal };
150
224
  const thinkingBudget = this.#thinkEffort !== undefined
151
225
  ? resolveThinkingBudget(this.#thinkEffort, this.#maxTokens)
152
226
  : undefined;
@@ -168,97 +242,113 @@ export class AnthropicProvider extends AIProvider {
168
242
  messages: formattedMessages,
169
243
  ...(formattedTools ? { tools: formattedTools } : {}),
170
244
  ...thinkingParam,
245
+ ...metadataParam,
171
246
  stream: true,
172
- });
247
+ }, requestOptions);
173
248
  let fullContent = "";
174
- let inputTokens = 0;
249
+ let inputMissTokens = 0;
250
+ let inputCacheTokens = 0;
175
251
  let outputTokens = 0;
176
252
  // Anthropic streams tool_use blocks as a start event (with
177
253
  // id/name) followed by incremental input_json_delta chunks,
178
254
  // so the partial JSON has to be accumulated per block index
179
255
  // the same way OpenAI's function-call arguments are.
180
256
  const toolBlocks = {};
257
+ // Only blocks that reached content_block_stop land here — if the stream is
258
+ // aborted mid-block (see the catch below), that block is still open in
259
+ // toolBlocks above but deliberately left out of the response: its JSON may be
260
+ // truncated mid-argument, and dispatching a tool call built from garbage input
261
+ // would be worse than just not surfacing it.
262
+ const finishedToolCalls = [];
181
263
  // Thinking blocks stream the same way: a start event, then
182
264
  // incremental thinking_delta (text) and signature_delta
183
265
  // (the cryptographic signature Anthropic requires replayed
184
266
  // verbatim alongside a tool_use in the same turn).
185
267
  const thinkingBlocks = {};
186
- for await (const event of stream) {
187
- if (event.type === "content_block_start") {
188
- if (event.content_block?.type === "tool_use") {
189
- toolBlocks[event.index] = {
190
- id: event.content_block.id,
191
- name: event.content_block.name,
192
- inputJson: "",
193
- };
268
+ try {
269
+ for await (const event of stream) {
270
+ if (event.type === "content_block_start") {
271
+ if (event.content_block?.type === "tool_use") {
272
+ toolBlocks[event.index] = {
273
+ id: event.content_block.id,
274
+ name: event.content_block.name,
275
+ inputJson: "",
276
+ };
277
+ }
278
+ if (event.content_block?.type === "thinking") {
279
+ thinkingBlocks[event.index] = { type: "thinking", thinking: "", signature: "" };
280
+ }
194
281
  }
195
- if (event.content_block?.type === "thinking") {
196
- thinkingBlocks[event.index] = { type: "thinking", thinking: "", signature: "" };
282
+ if (event.type === "content_block_delta") {
283
+ if (event.delta?.type === "text_delta" && event.delta.text) {
284
+ fullContent += event.delta.text;
285
+ await streamCallback({ role: "assistant", content: event.delta.text, done: false, usage: { inputMissTokens, inputCacheTokens, outputTokens } });
286
+ }
287
+ if (event.delta?.type === "input_json_delta" && toolBlocks[event.index]) {
288
+ toolBlocks[event.index].inputJson += event.delta.partial_json || "";
289
+ }
290
+ if (event.delta?.type === "thinking_delta" && thinkingBlocks[event.index]) {
291
+ thinkingBlocks[event.index].thinking += event.delta.thinking || "";
292
+ await streamCallback({ role: "assistant", content: "", done: false, thinking: event.delta.thinking || "", usage: { inputMissTokens, inputCacheTokens, outputTokens } });
293
+ }
294
+ if (event.delta?.type === "signature_delta" && thinkingBlocks[event.index]) {
295
+ thinkingBlocks[event.index].signature += event.delta.signature || "";
296
+ }
197
297
  }
198
- }
199
- if (event.type === "content_block_delta") {
200
- if (event.delta?.type === "text_delta" && event.delta.text) {
201
- fullContent += event.delta.text;
202
- await streamCallback({ role: "assistant", content: event.delta.text, done: false });
298
+ // A tool_use block is fully formed the moment Anthropic
299
+ // closes it — unlike OpenAI/DeepSeek there's no need to
300
+ // infer completion from the next block starting.
301
+ if (event.type === "content_block_stop" && toolBlocks[event.index]) {
302
+ const tb = toolBlocks[event.index];
303
+ let inputs = {};
304
+ try {
305
+ inputs = JSON.parse(tb.inputJson || "{}");
306
+ }
307
+ catch {
308
+ inputs = {};
309
+ }
310
+ const finished = { id: tb.id || "", name: tb.name || "", inputs };
311
+ finishedToolCalls.push(finished);
312
+ await streamCallback({ role: "assistant", content: "", done: false, toolCalls: [finished], usage: { inputMissTokens, inputCacheTokens, outputTokens } });
203
313
  }
204
- if (event.delta?.type === "input_json_delta" && toolBlocks[event.index]) {
205
- toolBlocks[event.index].inputJson += event.delta.partial_json || "";
206
- }
207
- if (event.delta?.type === "thinking_delta" && thinkingBlocks[event.index]) {
208
- thinkingBlocks[event.index].thinking += event.delta.thinking || "";
209
- await streamCallback({ role: "assistant", content: "", done: false, thinking: event.delta.thinking || "" });
210
- }
211
- if (event.delta?.type === "signature_delta" && thinkingBlocks[event.index]) {
212
- thinkingBlocks[event.index].signature += event.delta.signature || "";
213
- }
214
- }
215
- // A tool_use block is fully formed the moment Anthropic
216
- // closes it — unlike OpenAI/DeepSeek there's no need to
217
- // infer completion from the next block starting.
218
- if (event.type === "content_block_stop" && toolBlocks[event.index]) {
219
- const tb = toolBlocks[event.index];
220
- let inputs = {};
221
- try {
222
- inputs = JSON.parse(tb.inputJson || "{}");
314
+ if (event.type === "message_start") {
315
+ const usage = event.message?.usage;
316
+ inputMissTokens = (usage?.input_tokens || 0) + (usage?.cache_creation_input_tokens || 0);
317
+ inputCacheTokens = usage?.cache_read_input_tokens || 0;
318
+ await streamCallback({ role: "assistant", content: "", done: false, usage: { inputMissTokens, inputCacheTokens, outputTokens } });
223
319
  }
224
- catch {
225
- inputs = {};
226
- }
227
- await streamCallback({ role: "assistant", content: "", done: false, toolCalls: [{ id: tb.id || "", name: tb.name || "", inputs }] });
228
- }
229
- if (event.type === "message_start") {
230
- inputTokens = event.message?.usage?.input_tokens || 0;
231
- }
232
- if (event.type === "message_delta") {
233
- if (event.usage?.output_tokens !== undefined) {
234
- outputTokens = event.usage.output_tokens;
320
+ if (event.type === "message_delta") {
321
+ if (event.usage?.output_tokens !== undefined) {
322
+ outputTokens = event.usage.output_tokens;
323
+ await streamCallback({ role: "assistant", content: "", done: false, usage: { inputMissTokens, inputCacheTokens, outputTokens } });
324
+ }
235
325
  }
236
326
  }
237
327
  }
238
- const toolCalls = Object.keys(toolBlocks).length > 0
239
- ? Object.values(toolBlocks).map(tb => {
240
- let inputs = {};
241
- try {
242
- inputs = JSON.parse(tb.inputJson || "{}");
243
- }
244
- catch {
245
- inputs = {};
246
- }
247
- return { id: tb.id || "", name: tb.name || "", inputs };
248
- })
249
- : undefined;
328
+ catch (err) {
329
+ // A signal we were handed ourselves (see immediateStop() in BaseAgent)
330
+ // aborted the underlying request mid-stream. Treat this like a naturally
331
+ // truncated turn rather than a failure: fall through and return whatever
332
+ // text/tool-calls/tokens were accumulated above, instead of throwing away
333
+ // content the caller already saw via streamCallback. A genuine network/API
334
+ // error (signal not aborted) still propagates so withRetry can retry it.
335
+ if (!signal?.aborted)
336
+ throw err;
337
+ }
338
+ const toolCalls = finishedToolCalls.length > 0 ? finishedToolCalls : undefined;
250
339
  const providerThinking = Object.keys(thinkingBlocks).length > 0 ? Object.values(thinkingBlocks) : undefined;
251
340
  const thinkingText = providerThinking?.map(b => b.thinking).join("");
252
- await streamCallback({ role: "assistant", content: "", done: true });
341
+ await streamCallback({ role: "assistant", content: "", done: true, usage: { inputMissTokens, inputCacheTokens, outputTokens } });
253
342
  return {
254
343
  content: fullContent,
255
- inputTokens,
344
+ inputMissTokens,
345
+ inputCacheTokens,
256
346
  outputTokens,
257
347
  ...(toolCalls ? { toolCalls } : {}),
258
348
  ...(thinkingText ? { thinking: thinkingText } : {}),
259
349
  ...(providerThinking ? { providerThinking } : {}),
260
350
  };
261
- });
351
+ }, signal);
262
352
  }
263
353
  else {
264
354
  return withRetry(async () => {
@@ -269,18 +359,20 @@ export class AnthropicProvider extends AIProvider {
269
359
  messages: formattedMessages,
270
360
  ...(formattedTools ? { tools: formattedTools } : {}),
271
361
  ...thinkingParam,
272
- });
362
+ ...metadataParam,
363
+ }, requestOptions);
273
364
  const toolCalls = fromAnthropicToolCalls(response.content);
274
365
  const { text: thinkingText, blocks: providerThinking } = thinkingFromAnthropicContent(response.content);
275
366
  return {
276
367
  content: textFromAnthropicContent(response.content),
277
- inputTokens: response.usage?.input_tokens || 0,
368
+ inputMissTokens: (response.usage?.input_tokens || 0) + (response.usage?.cache_creation_input_tokens || 0),
369
+ inputCacheTokens: response.usage?.cache_read_input_tokens || 0,
278
370
  outputTokens: response.usage?.output_tokens || 0,
279
371
  ...(toolCalls ? { toolCalls } : {}),
280
372
  ...(thinkingText ? { thinking: thinkingText } : {}),
281
373
  ...(providerThinking ? { providerThinking } : {}),
282
374
  };
283
- });
375
+ }, signal);
284
376
  }
285
377
  }
286
378
  }