@tyvm/knowhow 0.0.33 → 0.0.35

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 (504) hide show
  1. package/autodoc/plugins/downloader/downloader.mdx +2 -2
  2. package/benchmarks/.dockerignore +7 -0
  3. package/benchmarks/README.md +166 -0
  4. package/benchmarks/docker/Dockerfile +68 -0
  5. package/benchmarks/example-config.yml +27 -0
  6. package/benchmarks/jest.config.js +13 -0
  7. package/benchmarks/package-lock.json +4297 -0
  8. package/benchmarks/package.json +39 -0
  9. package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +2814 -0
  10. package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +2014 -0
  11. package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +3121 -0
  12. package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +98 -0
  13. package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +3256 -0
  14. package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +4298 -0
  15. package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3031 -0
  16. package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +2990 -0
  17. package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3256 -0
  18. package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3007 -0
  19. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +3256 -0
  20. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +3036 -0
  21. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +3280 -0
  22. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +1920 -0
  23. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +3281 -0
  24. package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +2896 -0
  25. package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3011 -0
  26. package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +3003 -0
  27. package/benchmarks/scripts/build-and-run.sh +47 -0
  28. package/benchmarks/scripts/clone-exercism.sh +92 -0
  29. package/benchmarks/scripts/validate.sh +48 -0
  30. package/benchmarks/src/__tests__/runner.test.ts +27 -0
  31. package/benchmarks/src/cli.ts +90 -0
  32. package/benchmarks/src/evaluators/EvaluatorRegistry.ts +64 -0
  33. package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +183 -0
  34. package/benchmarks/src/evaluators/index.ts +3 -0
  35. package/benchmarks/src/evaluators/types.ts +22 -0
  36. package/benchmarks/src/index.ts +3 -0
  37. package/benchmarks/src/providers.ts +13 -0
  38. package/benchmarks/src/runner.ts +824 -0
  39. package/benchmarks/src/types.ts +63 -0
  40. package/benchmarks/tsconfig.json +19 -0
  41. package/jest.config.js +2 -1
  42. package/leaderboard/README.md +148 -0
  43. package/leaderboard/app/api/benchmark-data/route.ts +131 -0
  44. package/leaderboard/app/api/benchmark-detail/route.ts +172 -0
  45. package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +501 -0
  46. package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +375 -0
  47. package/leaderboard/app/globals.css +27 -0
  48. package/leaderboard/app/layout.tsx +21 -0
  49. package/leaderboard/app/page.tsx +170 -0
  50. package/leaderboard/components/LeaderboardTable.tsx +168 -0
  51. package/leaderboard/components/PerformanceChart.tsx +109 -0
  52. package/leaderboard/next-env.d.ts +5 -0
  53. package/leaderboard/next.config.js +4 -0
  54. package/leaderboard/package-lock.json +6363 -0
  55. package/leaderboard/package.json +28 -0
  56. package/leaderboard/postcss.config.js +6 -0
  57. package/leaderboard/tailwind.config.js +17 -0
  58. package/leaderboard/tsconfig.json +28 -0
  59. package/leaderboard/types/benchmark.ts +67 -0
  60. package/leaderboard/utils/dataProcessor.ts +33 -0
  61. package/package.json +2 -1
  62. package/src/agents/base/base.ts +182 -24
  63. package/src/agents/base/prompt.ts +28 -0
  64. package/src/agents/index.ts +3 -0
  65. package/src/agents/patcher/patcher.ts +6 -4
  66. package/src/agents/setup/setup.ts +56 -0
  67. package/src/agents/tools/agentCall.ts +6 -2
  68. package/src/agents/tools/aiClient.ts +74 -8
  69. package/src/agents/tools/execCommand.ts +13 -14
  70. package/src/agents/tools/executeScript/README.md +16 -0
  71. package/src/agents/tools/index.ts +2 -0
  72. package/src/agents/tools/list.ts +73 -16
  73. package/src/agents/tools/startAgentTask.ts +109 -0
  74. package/src/agents/tools/textSearch.ts +1 -1
  75. package/src/agents/tools/visionTool.ts +31 -2
  76. package/src/agents/tools/ycmd/client.ts +608 -0
  77. package/src/agents/tools/ycmd/definitions.ts +294 -0
  78. package/src/agents/tools/ycmd/detection.ts +211 -0
  79. package/src/agents/tools/ycmd/index.ts +11 -0
  80. package/src/agents/tools/ycmd/installer.ts +251 -0
  81. package/src/agents/tools/ycmd/server.ts +535 -0
  82. package/src/agents/tools/ycmd/serverManager.ts +316 -0
  83. package/src/agents/tools/ycmd/tools/completion.ts +113 -0
  84. package/src/agents/tools/ycmd/tools/diagnostics.ts +155 -0
  85. package/src/agents/tools/ycmd/tools/getLocations.ts +173 -0
  86. package/src/agents/tools/ycmd/tools/goto.ts +169 -0
  87. package/src/agents/tools/ycmd/tools/refactor.ts +204 -0
  88. package/src/agents/tools/ycmd/tools/signature.ts +174 -0
  89. package/src/agents/tools/ycmd/tools/start.ts +95 -0
  90. package/src/agents/tools/ycmd/utils/pathUtils.ts +59 -0
  91. package/src/ai.ts +15 -0
  92. package/src/chat/CliChatService.ts +277 -0
  93. package/src/chat/modules/AgentModule.ts +985 -0
  94. package/src/chat/modules/AskModule.ts +98 -0
  95. package/src/chat/modules/BaseChatModule.ts +66 -0
  96. package/src/chat/modules/InternalChatModule.ts +174 -0
  97. package/src/chat/modules/SearchModule.ts +166 -0
  98. package/src/chat/modules/SetupModule.ts +185 -0
  99. package/src/chat/modules/SystemModule.ts +120 -0
  100. package/src/chat/modules/VoiceModule.ts +70 -0
  101. package/src/chat/modules/index.js +5 -0
  102. package/src/chat/types.ts +97 -0
  103. package/src/chat.ts +9 -1
  104. package/src/chat2.ts +62 -0
  105. package/src/cli.ts +264 -35
  106. package/src/clients/anthropic.ts +14 -7
  107. package/src/clients/gemini.ts +15 -7
  108. package/src/clients/http.ts +17 -7
  109. package/src/clients/index.ts +117 -4
  110. package/src/clients/knowhow.ts +7 -2
  111. package/src/clients/knowhowMcp.ts +118 -0
  112. package/src/clients/openai.ts +32 -8
  113. package/src/clients/types.ts +1 -0
  114. package/src/clients/xai.ts +17 -5
  115. package/src/config.ts +30 -5
  116. package/src/conversion.ts +4 -1
  117. package/src/login.ts +26 -9
  118. package/src/microphone.ts +0 -1
  119. package/src/plugins/downloader/downloader.ts +191 -49
  120. package/src/plugins/downloader/plugin.ts +3 -1
  121. package/src/plugins/plugins.ts +3 -0
  122. package/src/processors/CustomVariables.ts +425 -0
  123. package/src/processors/HarmonyToolProcessor.ts +264 -0
  124. package/src/processors/XmlToolCallProcessor.ts +533 -0
  125. package/src/processors/index.ts +3 -0
  126. package/src/prompts/KnowhowConfigExamples.ts +376 -0
  127. package/src/services/KnowhowClient.ts +49 -3
  128. package/src/services/Mcp.ts +42 -3
  129. package/src/services/McpServer.ts +14 -4
  130. package/src/services/McpWebsocketTransport.ts +21 -7
  131. package/src/services/MessageProcessor.ts +10 -5
  132. package/src/services/index.ts +5 -0
  133. package/src/services/script-execution/ScriptExecutor.ts +34 -1
  134. package/src/services/types.ts +17 -14
  135. package/src/types.ts +17 -0
  136. package/src/utils/index.ts +138 -0
  137. package/tests/XmlToolCallProcessor.test.ts +468 -0
  138. package/tests/manual/ycmd/debug_diagnostics_test.ts +127 -0
  139. package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +26 -0
  140. package/tests/manual/ycmd/fixtures/file_change_test.ts +17 -0
  141. package/tests/manual/ycmd/minimal_advanced_test.ts +108 -0
  142. package/tests/manual/ycmd/simple_diagnostics_test.ts +61 -0
  143. package/tests/manual/ycmd/simple_test.ts +74 -0
  144. package/tests/manual/ycmd/test-typescript-sample.ts +34 -0
  145. package/tests/manual/ycmd/test_advanced_features.ts +407 -0
  146. package/tests/manual/ycmd/test_advanced_with_tools.ts +320 -0
  147. package/tests/manual/ycmd/test_comprehensive_typescript.ts +179 -0
  148. package/tests/manual/ycmd/test_diagnostics_file_changes.ts +249 -0
  149. package/tests/manual/ycmd/test_diagnostics_fix.ts +99 -0
  150. package/tests/manual/ycmd/test_diagnostics_simple.ts +100 -0
  151. package/tests/manual/ycmd/test_diagnostics_timing.ts +120 -0
  152. package/tests/manual/ycmd/test_discover_commands.ts +310 -0
  153. package/tests/manual/ycmd/test_endpoints.ts +115 -0
  154. package/tests/manual/ycmd/test_final_comprehensive.ts +218 -0
  155. package/tests/manual/ycmd/test_final_validation.ts +150 -0
  156. package/tests/manual/ycmd/test_implementation.js +42 -0
  157. package/tests/manual/ycmd/test_individual_ycmd_tool.ts +39 -0
  158. package/tests/manual/ycmd/test_server_manager.ts +52 -0
  159. package/tests/manual/ycmd/test_simple_debug.ts +86 -0
  160. package/tests/manual/ycmd/test_tsserver_workflow.js +83 -0
  161. package/tests/manual/ycmd/test_tsserver_workflow.ts +122 -0
  162. package/tests/manual/ycmd/test_typescript_simple.ts +48 -0
  163. package/tests/manual/ycmd/test_typescript_ycmd.ts +105 -0
  164. package/tests/manual/ycmd/test_workspace_config.ts +90 -0
  165. package/tests/manual/ycmd/test_ycmd_auto_start.ts +137 -0
  166. package/tests/manual/ycmd/test_ycmd_comprehensive.ts +73 -0
  167. package/tests/manual/ycmd/test_ycmd_connection.py +10 -0
  168. package/tests/manual/ycmd/test_ycmd_direct.ts +142 -0
  169. package/tests/manual/ycmd/test_ycmd_experiment.ts +48 -0
  170. package/tests/manual/ycmd/test_ycmd_final.ts +200 -0
  171. package/tests/manual/ycmd/test_ycmd_fixed.py +18 -0
  172. package/tests/manual/ycmd/test_ycmd_integration.ts +112 -0
  173. package/tests/manual/ycmd/test_ycmd_simple.ts +45 -0
  174. package/tests/manual/ycmd/test_ycmd_usage.py +27 -0
  175. package/tests/manual/ycmd/working_simple_test.ts +134 -0
  176. package/ts_build/src/agents/base/base.d.ts +15 -1
  177. package/ts_build/src/agents/base/base.js +121 -20
  178. package/ts_build/src/agents/base/base.js.map +1 -1
  179. package/ts_build/src/agents/base/prompt.d.ts +1 -1
  180. package/ts_build/src/agents/base/prompt.js +28 -0
  181. package/ts_build/src/agents/base/prompt.js.map +1 -1
  182. package/ts_build/src/agents/index.d.ts +2 -0
  183. package/ts_build/src/agents/index.js +2 -0
  184. package/ts_build/src/agents/index.js.map +1 -1
  185. package/ts_build/src/agents/patcher/patcher.js +6 -3
  186. package/ts_build/src/agents/patcher/patcher.js.map +1 -1
  187. package/ts_build/src/agents/setup/setup.d.ts +8 -0
  188. package/ts_build/src/agents/setup/setup.js +59 -0
  189. package/ts_build/src/agents/setup/setup.js.map +1 -0
  190. package/ts_build/src/agents/tools/agentCall.js +5 -2
  191. package/ts_build/src/agents/tools/agentCall.js.map +1 -1
  192. package/ts_build/src/agents/tools/aiClient.d.ts +6 -5
  193. package/ts_build/src/agents/tools/aiClient.js +37 -6
  194. package/ts_build/src/agents/tools/aiClient.js.map +1 -1
  195. package/ts_build/src/agents/tools/execCommand.d.ts +2 -2
  196. package/ts_build/src/agents/tools/execCommand.js +5 -6
  197. package/ts_build/src/agents/tools/execCommand.js.map +1 -1
  198. package/ts_build/src/agents/tools/executeScript/index.d.ts +1 -1
  199. package/ts_build/src/agents/tools/index.d.ts +2 -0
  200. package/ts_build/src/agents/tools/index.js +2 -0
  201. package/ts_build/src/agents/tools/index.js.map +1 -1
  202. package/ts_build/src/agents/tools/list.js +66 -16
  203. package/ts_build/src/agents/tools/list.js.map +1 -1
  204. package/ts_build/src/agents/tools/startAgentTask.d.ts +13 -0
  205. package/ts_build/src/agents/tools/startAgentTask.js +74 -0
  206. package/ts_build/src/agents/tools/startAgentTask.js.map +1 -0
  207. package/ts_build/src/agents/tools/startChatTask.d.ts +13 -0
  208. package/ts_build/src/agents/tools/startChatTask.js +73 -0
  209. package/ts_build/src/agents/tools/startChatTask.js.map +1 -0
  210. package/ts_build/src/agents/tools/textSearch.js +1 -1
  211. package/ts_build/src/agents/tools/textSearch.js.map +1 -1
  212. package/ts_build/src/agents/tools/visionTool.d.ts +1 -1
  213. package/ts_build/src/agents/tools/visionTool.js +23 -3
  214. package/ts_build/src/agents/tools/visionTool.js.map +1 -1
  215. package/ts_build/src/agents/tools/ycmd/client.d.ts +93 -0
  216. package/ts_build/src/agents/tools/ycmd/client.js +355 -0
  217. package/ts_build/src/agents/tools/ycmd/client.js.map +1 -0
  218. package/ts_build/src/agents/tools/ycmd/definitions.d.ts +345 -0
  219. package/ts_build/src/agents/tools/ycmd/definitions.js +298 -0
  220. package/ts_build/src/agents/tools/ycmd/definitions.js.map +1 -0
  221. package/ts_build/src/agents/tools/ycmd/detection.d.ts +11 -0
  222. package/ts_build/src/agents/tools/ycmd/detection.js +175 -0
  223. package/ts_build/src/agents/tools/ycmd/detection.js.map +1 -0
  224. package/ts_build/src/agents/tools/ycmd/index.d.ts +8 -0
  225. package/ts_build/src/agents/tools/ycmd/index.js +20 -0
  226. package/ts_build/src/agents/tools/ycmd/index.js.map +1 -0
  227. package/ts_build/src/agents/tools/ycmd/installer.d.ts +19 -0
  228. package/ts_build/src/agents/tools/ycmd/installer.js +196 -0
  229. package/ts_build/src/agents/tools/ycmd/installer.js.map +1 -0
  230. package/ts_build/src/agents/tools/ycmd/server.d.ts +35 -0
  231. package/ts_build/src/agents/tools/ycmd/server.js +363 -0
  232. package/ts_build/src/agents/tools/ycmd/server.js.map +1 -0
  233. package/ts_build/src/agents/tools/ycmd/serverManager.d.ts +39 -0
  234. package/ts_build/src/agents/tools/ycmd/serverManager.js +210 -0
  235. package/ts_build/src/agents/tools/ycmd/serverManager.js.map +1 -0
  236. package/ts_build/src/agents/tools/ycmd/tools/completion.d.ts +22 -0
  237. package/ts_build/src/agents/tools/ycmd/tools/completion.js +72 -0
  238. package/ts_build/src/agents/tools/ycmd/tools/completion.js.map +1 -0
  239. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.d.ts +42 -0
  240. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js +88 -0
  241. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js.map +1 -0
  242. package/ts_build/src/agents/tools/ycmd/tools/getLocations.d.ts +22 -0
  243. package/ts_build/src/agents/tools/ycmd/tools/getLocations.js +142 -0
  244. package/ts_build/src/agents/tools/ycmd/tools/getLocations.js.map +1 -0
  245. package/ts_build/src/agents/tools/ycmd/tools/goto.d.ts +20 -0
  246. package/ts_build/src/agents/tools/ycmd/tools/goto.js +101 -0
  247. package/ts_build/src/agents/tools/ycmd/tools/goto.js.map +1 -0
  248. package/ts_build/src/agents/tools/ycmd/tools/refactor.d.ts +32 -0
  249. package/ts_build/src/agents/tools/ycmd/tools/refactor.js +123 -0
  250. package/ts_build/src/agents/tools/ycmd/tools/refactor.js.map +1 -0
  251. package/ts_build/src/agents/tools/ycmd/tools/signature.d.ts +25 -0
  252. package/ts_build/src/agents/tools/ycmd/tools/signature.js +110 -0
  253. package/ts_build/src/agents/tools/ycmd/tools/signature.js.map +1 -0
  254. package/ts_build/src/agents/tools/ycmd/tools/start.d.ts +17 -0
  255. package/ts_build/src/agents/tools/ycmd/tools/start.js +65 -0
  256. package/ts_build/src/agents/tools/ycmd/tools/start.js.map +1 -0
  257. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.d.ts +4 -0
  258. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js +67 -0
  259. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js.map +1 -0
  260. package/ts_build/src/ai.d.ts +1 -0
  261. package/ts_build/src/ai.js +40 -1
  262. package/ts_build/src/ai.js.map +1 -1
  263. package/ts_build/src/chat/ChatCommandHandler.d.ts +36 -0
  264. package/ts_build/src/chat/ChatCommandHandler.js +268 -0
  265. package/ts_build/src/chat/ChatCommandHandler.js.map +1 -0
  266. package/ts_build/src/chat/ChatInputManager.d.ts +22 -0
  267. package/ts_build/src/chat/ChatInputManager.js +85 -0
  268. package/ts_build/src/chat/ChatInputManager.js.map +1 -0
  269. package/ts_build/src/chat/ChatManager.d.ts +49 -0
  270. package/ts_build/src/chat/ChatManager.js +271 -0
  271. package/ts_build/src/chat/ChatManager.js.map +1 -0
  272. package/ts_build/src/chat/ChatSession.d.ts +32 -0
  273. package/ts_build/src/chat/ChatSession.js +3 -0
  274. package/ts_build/src/chat/ChatSession.js.map +1 -0
  275. package/ts_build/src/chat/ChatSessionManager.d.ts +19 -0
  276. package/ts_build/src/chat/ChatSessionManager.js +188 -0
  277. package/ts_build/src/chat/ChatSessionManager.js.map +1 -0
  278. package/ts_build/src/chat/ChatStateManager.d.ts +58 -0
  279. package/ts_build/src/chat/ChatStateManager.js +156 -0
  280. package/ts_build/src/chat/ChatStateManager.js.map +1 -0
  281. package/ts_build/src/chat/CliChatService.d.ts +35 -0
  282. package/ts_build/src/chat/CliChatService.js +201 -0
  283. package/ts_build/src/chat/CliChatService.js.map +1 -0
  284. package/ts_build/src/chat/InterruptibleInput.d.ts +20 -0
  285. package/ts_build/src/chat/InterruptibleInput.js +109 -0
  286. package/ts_build/src/chat/InterruptibleInput.js.map +1 -0
  287. package/ts_build/src/chat/interfaces/ChatModule.d.ts +6 -0
  288. package/ts_build/src/chat/interfaces/ChatModule.js +3 -0
  289. package/ts_build/src/chat/interfaces/ChatModule.js.map +1 -0
  290. package/ts_build/src/chat/modules/AgentModule.d.ts +57 -0
  291. package/ts_build/src/chat/modules/AgentModule.js +709 -0
  292. package/ts_build/src/chat/modules/AgentModule.js.map +1 -0
  293. package/ts_build/src/chat/modules/AskModule.d.ts +10 -0
  294. package/ts_build/src/chat/modules/AskModule.js +63 -0
  295. package/ts_build/src/chat/modules/AskModule.js.map +1 -0
  296. package/ts_build/src/chat/modules/BaseChatModule.d.ts +14 -0
  297. package/ts_build/src/chat/modules/BaseChatModule.js +32 -0
  298. package/ts_build/src/chat/modules/BaseChatModule.js.map +1 -0
  299. package/ts_build/src/chat/modules/InternalChatModule.d.ts +24 -0
  300. package/ts_build/src/chat/modules/InternalChatModule.js +127 -0
  301. package/ts_build/src/chat/modules/InternalChatModule.js.map +1 -0
  302. package/ts_build/src/chat/modules/SearchModule.d.ts +12 -0
  303. package/ts_build/src/chat/modules/SearchModule.js +119 -0
  304. package/ts_build/src/chat/modules/SearchModule.js.map +1 -0
  305. package/ts_build/src/chat/modules/SetupModule.d.ts +15 -0
  306. package/ts_build/src/chat/modules/SetupModule.js +147 -0
  307. package/ts_build/src/chat/modules/SetupModule.js.map +1 -0
  308. package/ts_build/src/chat/modules/SystemModule.d.ts +14 -0
  309. package/ts_build/src/chat/modules/SystemModule.js +90 -0
  310. package/ts_build/src/chat/modules/SystemModule.js.map +1 -0
  311. package/ts_build/src/chat/modules/VoiceModule.d.ts +11 -0
  312. package/ts_build/src/chat/modules/VoiceModule.js +57 -0
  313. package/ts_build/src/chat/modules/VoiceModule.js.map +1 -0
  314. package/ts_build/src/chat/types.d.ts +83 -0
  315. package/ts_build/src/chat/types.js +3 -0
  316. package/ts_build/src/chat/types.js.map +1 -0
  317. package/ts_build/src/chat.js +7 -1
  318. package/ts_build/src/chat.js.map +1 -1
  319. package/ts_build/src/chat2.d.ts +3 -0
  320. package/ts_build/src/chat2.js +47 -0
  321. package/ts_build/src/chat2.js.map +1 -0
  322. package/ts_build/src/cli.js +218 -37
  323. package/ts_build/src/cli.js.map +1 -1
  324. package/ts_build/src/clients/anthropic.d.ts +5 -2
  325. package/ts_build/src/clients/anthropic.js +12 -7
  326. package/ts_build/src/clients/anthropic.js.map +1 -1
  327. package/ts_build/src/clients/gemini.d.ts +6 -3
  328. package/ts_build/src/clients/gemini.js +13 -7
  329. package/ts_build/src/clients/gemini.js.map +1 -1
  330. package/ts_build/src/clients/http.d.ts +1 -0
  331. package/ts_build/src/clients/http.js +12 -5
  332. package/ts_build/src/clients/http.js.map +1 -1
  333. package/ts_build/src/clients/index.d.ts +10 -0
  334. package/ts_build/src/clients/index.js +74 -4
  335. package/ts_build/src/clients/index.js.map +1 -1
  336. package/ts_build/src/clients/knowhow.d.ts +3 -1
  337. package/ts_build/src/clients/knowhow.js +8 -2
  338. package/ts_build/src/clients/knowhow.js.map +1 -1
  339. package/ts_build/src/clients/knowhowMcp.d.ts +20 -0
  340. package/ts_build/src/clients/knowhowMcp.js +86 -0
  341. package/ts_build/src/clients/knowhowMcp.js.map +1 -0
  342. package/ts_build/src/clients/openai.d.ts +5 -2
  343. package/ts_build/src/clients/openai.js +29 -8
  344. package/ts_build/src/clients/openai.js.map +1 -1
  345. package/ts_build/src/clients/types.d.ts +1 -0
  346. package/ts_build/src/clients/xai.d.ts +5 -2
  347. package/ts_build/src/clients/xai.js +15 -5
  348. package/ts_build/src/clients/xai.js.map +1 -1
  349. package/ts_build/src/config.js +24 -3
  350. package/ts_build/src/config.js.map +1 -1
  351. package/ts_build/src/conversion.js +6 -4
  352. package/ts_build/src/conversion.js.map +1 -1
  353. package/ts_build/src/login.d.ts +1 -1
  354. package/ts_build/src/login.js +21 -7
  355. package/ts_build/src/login.js.map +1 -1
  356. package/ts_build/src/microphone.js.map +1 -1
  357. package/ts_build/src/plugins/downloader/downloader.d.ts +7 -5
  358. package/ts_build/src/plugins/downloader/downloader.js +147 -44
  359. package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
  360. package/ts_build/src/plugins/downloader/plugin.js +5 -3
  361. package/ts_build/src/plugins/downloader/plugin.js.map +1 -1
  362. package/ts_build/src/plugins/plugins.js +3 -0
  363. package/ts_build/src/plugins/plugins.js.map +1 -1
  364. package/ts_build/src/processors/CustomVariables.d.ts +32 -0
  365. package/ts_build/src/processors/CustomVariables.js +297 -0
  366. package/ts_build/src/processors/CustomVariables.js.map +1 -0
  367. package/ts_build/src/processors/HarmonyToolProcessor.d.ts +15 -0
  368. package/ts_build/src/processors/HarmonyToolProcessor.js +154 -0
  369. package/ts_build/src/processors/HarmonyToolProcessor.js.map +1 -0
  370. package/ts_build/src/processors/XmlToolCallProcessor.d.ts +14 -0
  371. package/ts_build/src/processors/XmlToolCallProcessor.js +357 -0
  372. package/ts_build/src/processors/XmlToolCallProcessor.js.map +1 -0
  373. package/ts_build/src/processors/index.d.ts +3 -0
  374. package/ts_build/src/processors/index.js +7 -1
  375. package/ts_build/src/processors/index.js.map +1 -1
  376. package/ts_build/src/prompts/KnowhowConfigExamples.d.ts +2 -0
  377. package/ts_build/src/prompts/KnowhowConfigExamples.js +379 -0
  378. package/ts_build/src/prompts/KnowhowConfigExamples.js.map +1 -0
  379. package/ts_build/src/services/KnowhowClient.d.ts +22 -0
  380. package/ts_build/src/services/KnowhowClient.js +14 -2
  381. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  382. package/ts_build/src/services/Mcp.d.ts +1 -0
  383. package/ts_build/src/services/Mcp.js +20 -3
  384. package/ts_build/src/services/Mcp.js.map +1 -1
  385. package/ts_build/src/services/McpServer.d.ts +1 -1
  386. package/ts_build/src/services/McpServer.js +8 -4
  387. package/ts_build/src/services/McpServer.js.map +1 -1
  388. package/ts_build/src/services/McpWebsocketTransport.js +17 -7
  389. package/ts_build/src/services/McpWebsocketTransport.js.map +1 -1
  390. package/ts_build/src/services/MessageProcessor.d.ts +1 -1
  391. package/ts_build/src/services/MessageProcessor.js +4 -4
  392. package/ts_build/src/services/MessageProcessor.js.map +1 -1
  393. package/ts_build/src/services/index.d.ts +2 -0
  394. package/ts_build/src/services/index.js +4 -0
  395. package/ts_build/src/services/index.js.map +1 -1
  396. package/ts_build/src/services/script-execution/ScriptExecutor.d.ts +1 -0
  397. package/ts_build/src/services/script-execution/ScriptExecutor.js +23 -0
  398. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
  399. package/ts_build/src/services/types.d.ts +2 -6
  400. package/ts_build/src/services/types.js +4 -4
  401. package/ts_build/src/services/types.js.map +1 -1
  402. package/ts_build/src/types.d.ts +11 -0
  403. package/ts_build/src/types.js +8 -0
  404. package/ts_build/src/types.js.map +1 -1
  405. package/ts_build/src/utils/index.d.ts +2 -0
  406. package/ts_build/src/utils/index.js +102 -1
  407. package/ts_build/src/utils/index.js.map +1 -1
  408. package/ts_build/tests/XmlToolCallProcessor.test.d.ts +1 -0
  409. package/ts_build/tests/XmlToolCallProcessor.test.js +376 -0
  410. package/ts_build/tests/XmlToolCallProcessor.test.js.map +1 -0
  411. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +1 -0
  412. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +114 -0
  413. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +1 -0
  414. package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +2 -0
  415. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +104 -0
  416. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +1 -0
  417. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +1 -0
  418. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +74 -0
  419. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +1 -0
  420. package/ts_build/tests/manual/ycmd/simple_test.d.ts +2 -0
  421. package/ts_build/tests/manual/ycmd/simple_test.js +82 -0
  422. package/ts_build/tests/manual/ycmd/simple_test.js.map +1 -0
  423. package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +14 -0
  424. package/ts_build/tests/manual/ycmd/test-typescript-sample.js +20 -0
  425. package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +1 -0
  426. package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +2 -0
  427. package/ts_build/tests/manual/ycmd/test_advanced_features.js +297 -0
  428. package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +1 -0
  429. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +3 -0
  430. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +262 -0
  431. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +1 -0
  432. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +2 -0
  433. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +186 -0
  434. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +1 -0
  435. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +1 -0
  436. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +174 -0
  437. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +1 -0
  438. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +2 -0
  439. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +106 -0
  440. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +1 -0
  441. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +1 -0
  442. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +104 -0
  443. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +1 -0
  444. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +1 -0
  445. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +119 -0
  446. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +1 -0
  447. package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +2 -0
  448. package/ts_build/tests/manual/ycmd/test_discover_commands.js +243 -0
  449. package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +1 -0
  450. package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +2 -0
  451. package/ts_build/tests/manual/ycmd/test_endpoints.js +120 -0
  452. package/ts_build/tests/manual/ycmd/test_endpoints.js.map +1 -0
  453. package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +2 -0
  454. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +221 -0
  455. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +1 -0
  456. package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +2 -0
  457. package/ts_build/tests/manual/ycmd/test_final_validation.js +160 -0
  458. package/ts_build/tests/manual/ycmd/test_final_validation.js.map +1 -0
  459. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +2 -0
  460. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +37 -0
  461. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +1 -0
  462. package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +1 -0
  463. package/ts_build/tests/manual/ycmd/test_server_manager.js +38 -0
  464. package/ts_build/tests/manual/ycmd/test_server_manager.js.map +1 -0
  465. package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +2 -0
  466. package/ts_build/tests/manual/ycmd/test_simple_debug.js +99 -0
  467. package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +1 -0
  468. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +1 -0
  469. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +128 -0
  470. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +1 -0
  471. package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +1 -0
  472. package/ts_build/tests/manual/ycmd/test_typescript_simple.js +66 -0
  473. package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +1 -0
  474. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +1 -0
  475. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +105 -0
  476. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +1 -0
  477. package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +1 -0
  478. package/ts_build/tests/manual/ycmd/test_workspace_config.js +89 -0
  479. package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +1 -0
  480. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +2 -0
  481. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +130 -0
  482. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +1 -0
  483. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +1 -0
  484. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +83 -0
  485. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +1 -0
  486. package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +2 -0
  487. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +149 -0
  488. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +1 -0
  489. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +15 -0
  490. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +58 -0
  491. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +1 -0
  492. package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +2 -0
  493. package/ts_build/tests/manual/ycmd/test_ycmd_final.js +195 -0
  494. package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +1 -0
  495. package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +3 -0
  496. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +110 -0
  497. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +1 -0
  498. package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +2 -0
  499. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +36 -0
  500. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +1 -0
  501. package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +2 -0
  502. package/ts_build/tests/manual/ycmd/working_simple_test.js +134 -0
  503. package/ts_build/tests/manual/ycmd/working_simple_test.js.map +1 -0
  504. package/tsconfig.json +3 -1
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "leaderboard",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev -p 3333",
7
+ "build": "next build",
8
+ "start": "next start",
9
+ "lint": "next lint"
10
+ },
11
+ "dependencies": {
12
+ "next": "^14.2.31",
13
+ "react": "^18",
14
+ "react-dom": "^18",
15
+ "recharts": "^2.8.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^20",
19
+ "@types/react": "^18",
20
+ "@types/react-dom": "^18",
21
+ "autoprefixer": "^10.0.1",
22
+ "eslint": "^8",
23
+ "eslint-config-next": "14.0.0",
24
+ "postcss": "^8",
25
+ "tailwindcss": "^3.3.0",
26
+ "typescript": "^5"
27
+ }
28
+ }
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
@@ -0,0 +1,17 @@
1
+ /** @type {import('tailwindcss').Config} */
2
+ module.exports = {
3
+ content: [
4
+ './pages/**/*.{js,ts,jsx,tsx,mdx}',
5
+ './components/**/*.{js,ts,jsx,tsx,mdx}',
6
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
7
+ ],
8
+ theme: {
9
+ extend: {
10
+ colors: {
11
+ background: 'var(--background)',
12
+ foreground: 'var(--foreground)',
13
+ },
14
+ },
15
+ },
16
+ plugins: [],
17
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es5",
4
+ "lib": ["dom", "dom.iterable", "es6"],
5
+ "allowJs": true,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "esModuleInterop": true,
10
+ "module": "esnext",
11
+ "moduleResolution": "bundler",
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "jsx": "preserve",
15
+ "incremental": true,
16
+ "plugins": [
17
+ {
18
+ "name": "next"
19
+ }
20
+ ],
21
+ "baseUrl": ".",
22
+ "paths": {
23
+ "@/*": ["./*"]
24
+ }
25
+ },
26
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
27
+ "exclude": ["node_modules"]
28
+ }
@@ -0,0 +1,67 @@
1
+ export interface BenchmarkConfig {
2
+ language: string;
3
+ maxExercises: number;
4
+ model: string;
5
+ provider: string;
6
+ agent?: string;
7
+ limits: BenchmarkLimits;
8
+ outputFile: string;
9
+ }
10
+
11
+ export interface BenchmarkLimits {
12
+ maxTurns: number;
13
+ maxTime: number;
14
+ maxCost: number;
15
+ }
16
+
17
+ export interface ExerciseResult {
18
+ exerciseName: string;
19
+ status: 'success' | 'failure' | 'timeout' | 'cost_limit' | 'turn_limit';
20
+ testResult?: any;
21
+ turns: number;
22
+ timeElapsed: number;
23
+ cost: number;
24
+ startTime: string;
25
+ endTime: string;
26
+ errorMessage?: string;
27
+ finalOutput?: string;
28
+ }
29
+
30
+ export interface BenchmarkResults {
31
+ config: BenchmarkConfig;
32
+ commitHash?: string;
33
+ exercises: ExerciseResult[];
34
+ summary: {
35
+ totalExercises: number;
36
+ testableExercises?: number;
37
+ testsPassedCount?: number;
38
+ testsFailedCount?: number;
39
+ testPassRate?: number;
40
+ agentSuccessRate?: number;
41
+ successCount: number;
42
+ failureCount: number;
43
+ timeoutCount: number;
44
+ costLimitCount: number;
45
+ turnLimitCount: number;
46
+ totalTime: number;
47
+ totalCost: number;
48
+ averageTurns: number;
49
+ averageTime: number;
50
+ successRate: number;
51
+ };
52
+ startTime: string;
53
+ endTime: string;
54
+ }
55
+
56
+ export interface LeaderboardEntry {
57
+ model: string;
58
+ provider: string;
59
+ language: string;
60
+ successRate: number;
61
+ totalExercises: number;
62
+ averageCost: number;
63
+ averageTime: number;
64
+ averageTurns: number;
65
+ totalRuns: number;
66
+ lastRun: string;
67
+ }
@@ -0,0 +1,33 @@
1
+ import { LeaderboardEntry } from '@/types/benchmark';
2
+
3
+ export async function loadLeaderboardData(): Promise<LeaderboardEntry[]> {
4
+ try {
5
+ const response = await fetch('/api/benchmark-data');
6
+ const data = await response.json();
7
+ return data;
8
+ } catch (error) {
9
+ console.error('Error loading benchmark results:', error);
10
+ return [];
11
+ }
12
+ }
13
+
14
+ export function formatPercentage(value: number): string {
15
+ return `${value.toFixed(1)}%`;
16
+ }
17
+
18
+ export function formatCurrency(value: number): string {
19
+ return `$${value.toFixed(3)}`;
20
+ }
21
+
22
+ export function formatTime(seconds: number): string {
23
+ if (seconds < 60) {
24
+ return `${seconds.toFixed(1)}s`;
25
+ }
26
+ const minutes = Math.floor(seconds / 60);
27
+ const remainingSeconds = seconds % 60;
28
+ return `${minutes}m ${remainingSeconds.toFixed(1)}s`;
29
+ }
30
+
31
+ export function formatNumber(value: number): string {
32
+ return value.toFixed(1);
33
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyvm/knowhow",
3
- "version": "0.0.33",
3
+ "version": "0.0.35",
4
4
  "description": "ai cli with plugins and agents",
5
5
  "main": "ts_build/src/index.js",
6
6
  "bin": {
@@ -50,6 +50,7 @@
50
50
  "asana": "^3.0.16",
51
51
  "axios": "^1.5.0",
52
52
  "cheerio": "^1.0.0",
53
+ "commander": "^14.0.0",
53
54
  "diff": "^5.2.0",
54
55
  "esbuild": "^0.25.8",
55
56
  "express": "^4.19.2",
@@ -28,6 +28,7 @@ export interface AgentContext {
28
28
  Tools?: ToolsService;
29
29
  Events?: EventService;
30
30
  messageProcessor?: MessageProcessor;
31
+ Clients?: AIClient;
31
32
  }
32
33
 
33
34
  export abstract class BaseAgent implements IAgent {
@@ -43,6 +44,11 @@ export abstract class BaseAgent implements IAgent {
43
44
  protected currentModelPreferenceIndex = 0;
44
45
  protected easyFinalAnswer = false;
45
46
  protected requiredToolNames = ["finalAnswer"];
47
+ protected maxTurns: number | null = null;
48
+ protected maxSpend: number | null = null;
49
+ protected maxRunTimeMs: number | null = null;
50
+ protected startTimeMs: number | null = null;
51
+ protected turnCount = 0;
46
52
  protected totalCostUsd = 0;
47
53
  protected currentThread = 0;
48
54
  protected threads = [] as Message[][];
@@ -64,13 +70,15 @@ export abstract class BaseAgent implements IAgent {
64
70
  public tools: ToolsService;
65
71
  public events: EventService;
66
72
  public messageProcessor: MessageProcessor;
73
+ public clientService: AIClient;
67
74
 
68
75
  disabledTools = [];
69
76
 
70
77
  constructor(context: AgentContext) {
71
78
  this.tools = context.Tools;
72
79
  this.events = context.Events;
73
- this.messageProcessor = context.messageProcessor;
80
+ this.messageProcessor = context.messageProcessor || new MessageProcessor();
81
+ this.clientService = context.Clients || Clients;
74
82
 
75
83
  if (!this.tools) {
76
84
  throw new Error("ToolsService is required for BaseAgent");
@@ -79,10 +87,18 @@ export abstract class BaseAgent implements IAgent {
79
87
  if (!this.events) {
80
88
  throw new Error("EventService is required for BaseAgent");
81
89
  }
90
+ }
82
91
 
83
- if (!this.messageProcessor) {
84
- this.messageProcessor = new MessageProcessor();
85
- }
92
+ setMaxTurns(maxTurns: number | null) {
93
+ this.maxTurns = maxTurns;
94
+ }
95
+
96
+ setMaxSpend(maxSpend: number | null) {
97
+ this.maxSpend = maxSpend;
98
+ }
99
+
100
+ setMaxRunTime(maxRunTimeMs: number | null) {
101
+ this.maxRunTimeMs = maxRunTimeMs;
86
102
  }
87
103
 
88
104
  newTask() {
@@ -92,6 +108,8 @@ export abstract class BaseAgent implements IAgent {
92
108
  this.summaries = [];
93
109
  this.totalCostUsd = 0;
94
110
  this.status = "in_progress";
111
+ this.turnCount = 0;
112
+ this.startTimeMs = Date.now();
95
113
  }
96
114
 
97
115
  register() {
@@ -137,7 +155,8 @@ export abstract class BaseAgent implements IAgent {
137
155
 
138
156
  getClient() {
139
157
  if (!this.client) {
140
- this.client = Clients.getClient(this.provider)?.client;
158
+ console.log("Getting client for provider", this.provider);
159
+ this.client = this.clientService.getClient(this.provider)?.client;
141
160
  }
142
161
  return this.client;
143
162
  }
@@ -174,6 +193,45 @@ export abstract class BaseAgent implements IAgent {
174
193
  }
175
194
  }
176
195
 
196
+ private checkLimits(): boolean {
197
+ // Check turn limit
198
+ if (this.maxTurns !== null && this.turnCount >= this.maxTurns) {
199
+ console.log(`Turn limit reached: ${this.turnCount}/${this.maxTurns}`);
200
+ return true;
201
+ }
202
+
203
+ // Check spend limit
204
+ if (this.maxSpend !== null && this.totalCostUsd >= this.maxSpend) {
205
+ console.log(
206
+ `Spend limit reached: $${this.totalCostUsd.toFixed(
207
+ 4
208
+ )}/$${this.maxSpend.toFixed(4)}`
209
+ );
210
+ return true;
211
+ }
212
+
213
+ // Check runtime limit
214
+ if (this.maxRunTimeMs !== null && this.startTimeMs !== null) {
215
+ const currentRunTimeMs = Date.now() - this.startTimeMs;
216
+ if (currentRunTimeMs >= this.maxRunTimeMs) {
217
+ console.log(
218
+ `Runtime limit reached: ${currentRunTimeMs}ms/${this.maxRunTimeMs}ms`
219
+ );
220
+ return true;
221
+ }
222
+ }
223
+
224
+ return false;
225
+ }
226
+
227
+ private shouldTerminateFromLimits(): boolean {
228
+ return this.checkLimits();
229
+ }
230
+
231
+ getTurnCount(): number {
232
+ return this.turnCount;
233
+ }
234
+
177
235
  adjustTotalCostUsd(cost: number) {
178
236
  if (cost) {
179
237
  this.totalCostUsd += cost;
@@ -348,6 +406,27 @@ export abstract class BaseAgent implements IAgent {
348
406
  });
349
407
  }
350
408
 
409
+ async resume(resumeReason: string) {
410
+ const reason = resumeReason ? `Reason for resuming: ${resumeReason}` : "";
411
+
412
+ // Create resume prompt
413
+ const resumePrompt = `We are resuming a previously started task. Here's the context:
414
+ ORIGINAL REQUEST:
415
+ ${this.taskBreakdown}
416
+
417
+ LAST Progress State:
418
+ ${JSON.stringify(this.threads[this.currentThread], null, 2)}
419
+
420
+ Please continue from where you left off and complete the original request.
421
+ ${reason}
422
+
423
+ `;
424
+
425
+ const lastThread = this.threads[this.currentThread] || [];
426
+ this.status = "in_progress";
427
+ this.call(resumePrompt, lastThread);
428
+ }
429
+
351
430
  async kill() {
352
431
  console.log("Killing agent");
353
432
  this.agentEvents.emit(this.eventTypes.kill, this);
@@ -366,6 +445,26 @@ export abstract class BaseAgent implements IAgent {
366
445
 
367
446
  await this.selectHealthyModel();
368
447
 
448
+ // Increment turn count and check limits (only for new calls, not recursive ones)
449
+ this.turnCount++;
450
+ if (this.shouldTerminateFromLimits()) {
451
+ const currentRunTimeMs = this.startTimeMs
452
+ ? Date.now() - this.startTimeMs
453
+ : 0;
454
+ const limitMsg = `Task terminated due to limits reached. Turn: ${
455
+ this.turnCount
456
+ }/${this.maxTurns || "unlimited"}, Cost: $${this.totalCostUsd.toFixed(
457
+ 4
458
+ )}/${
459
+ this.maxSpend ? "$" + this.maxSpend.toFixed(4) : "unlimited"
460
+ }, Runtime: ${currentRunTimeMs}ms/${
461
+ this.maxRunTimeMs ? this.maxRunTimeMs + "ms" : "unlimited"
462
+ }`;
463
+ this.status = this.eventTypes.done;
464
+ this.agentEvents.emit(this.eventTypes.done, limitMsg);
465
+ return limitMsg;
466
+ }
467
+
369
468
  try {
370
469
  const model = this.getModel();
371
470
  let messages = _messages || (await this.getInitialMessages(userInput));
@@ -393,7 +492,7 @@ export abstract class BaseAgent implements IAgent {
393
492
  // Process messages before each AI call
394
493
  messages = await this.messageProcessor.processMessages(
395
494
  messages,
396
- "per_call"
495
+ "pre_call"
397
496
  );
398
497
  const compressThreshold = 10000;
399
498
 
@@ -405,25 +504,36 @@ export abstract class BaseAgent implements IAgent {
405
504
  });
406
505
 
407
506
  if (response?.usd_cost === undefined) {
408
- console.warn("Response cost is undefined", response);
507
+ console.warn(
508
+ "Response cost is undefined",
509
+ JSON.stringify(response, null, 2)
510
+ );
409
511
  }
410
512
 
411
513
  this.adjustTotalCostUsd(response?.usd_cost);
412
- this.logMessages(response.choices.map((c) => c.message));
413
-
414
- const firstMessage = response.choices[0].message;
415
- const newToolCalls = response.choices.flatMap(
416
- (c) => c.message.tool_calls
417
- );
418
514
 
515
+ // Typically, there's only one choice in the array, but you could have many
516
+ // If you set `n` to more than 1, you will get multiple choices
419
517
  for (const choice of response.choices) {
420
- const responseMessage = choice.message;
421
- console.log(responseMessage);
518
+ messages.push(choice.message);
519
+
520
+ messages = await this.messageProcessor.processMessages(
521
+ messages,
522
+ "post_call"
523
+ );
524
+
525
+ const lastMessage = messages[messages.length - 1];
526
+
527
+ this.logMessages([lastMessage]);
422
528
 
423
- const toolCalls = responseMessage.tool_calls;
424
- if (responseMessage.tool_calls) {
425
- // extend conversation with assistant's reply
426
- messages.push(responseMessage);
529
+ const toolCalls = lastMessage.tool_calls;
530
+ if (lastMessage.tool_calls) {
531
+ // About to call a tool, process the messages
532
+ // We could add all the tool calls, and do this once
533
+ messages = await this.messageProcessor.processMessages(
534
+ messages,
535
+ "pre_tools"
536
+ );
427
537
 
428
538
  for (const toolCall of toolCalls) {
429
539
  const toolMessages = await this.processToolMessages(toolCall);
@@ -439,26 +549,32 @@ export abstract class BaseAgent implements IAgent {
439
549
  if (finalMessage) {
440
550
  const doneMsg = finalMessage.content || "Done";
441
551
  this.agentEvents.emit(this.eventTypes.done, doneMsg);
552
+ this.status = this.eventTypes.done;
442
553
  return doneMsg;
443
554
  }
444
555
  }
445
556
  }
446
557
  }
447
558
 
559
+ const newToolCalls = response.choices.flatMap(
560
+ (c) => c.message.tool_calls
561
+ );
448
562
  // Process messages after tool execution
449
563
  if (newToolCalls && newToolCalls.length > 0) {
450
564
  messages = await this.messageProcessor.processMessages(
451
565
  messages,
452
- "post_call"
566
+ "post_tools"
453
567
  );
454
568
  }
455
569
 
456
570
  // Early exit: not required to call tool
571
+ const firstMessage = response.choices[0].message;
457
572
  if (
458
573
  response.choices.length === 1 &&
459
574
  firstMessage.content &&
460
575
  this.easyFinalAnswer
461
576
  ) {
577
+ this.status = this.eventTypes.done;
462
578
  this.agentEvents.emit(this.eventTypes.done, firstMessage.content);
463
579
  return firstMessage.content;
464
580
  }
@@ -469,14 +585,18 @@ export abstract class BaseAgent implements IAgent {
469
585
  this.requiredToolNames
470
586
  )} not available, options are ${this.getEnabledToolNames().join(", ")}`;
471
587
  console.error(error);
588
+ this.status = this.eventTypes.done;
472
589
  this.agentEvents.emit(this.eventTypes.done, error);
473
590
  return error;
474
591
  }
475
592
 
476
593
  // Early exit: killed, agent was requested to wrap up
477
- if (this.pendingUserMessages.length === 0 && this.status === "killed") {
594
+ if (
595
+ this.pendingUserMessages.length === 0 &&
596
+ this.status === this.eventTypes.kill
597
+ ) {
478
598
  console.log("Agent killed, stopping execution");
479
- this.status = "killed";
599
+ this.status = this.eventTypes.done;
480
600
  this.agentEvents.emit(this.eventTypes.done, firstMessage.content);
481
601
  return firstMessage.content;
482
602
  }
@@ -501,9 +621,43 @@ export abstract class BaseAgent implements IAgent {
501
621
  console.log(
502
622
  "Agent continuing to the next iteration, reminding agent how to terminate"
503
623
  );
624
+
625
+ const remainingTime =
626
+ this.maxRunTimeMs && this.startTimeMs
627
+ ? this.maxRunTimeMs - (Date.now() - this.startTimeMs)
628
+ : null;
629
+
630
+ const remainingTurns = this.maxTurns
631
+ ? this.maxTurns - this.turnCount
632
+ : null;
633
+
634
+ const timeRemainsingMsg = remainingTime
635
+ ? `You have approximately ${Math.floor(
636
+ remainingTime / 1000
637
+ )} seconds remaining for this task. `
638
+ : "";
639
+
640
+ const turnsRemainingMsg = remainingTurns
641
+ ? `You have ${remainingTurns} turns remaining. `
642
+ : "";
643
+
644
+ const remainingBudget = this.maxSpend
645
+ ? this.maxSpend - this.totalCostUsd
646
+ : null;
647
+ const budgetRemainingMsg = remainingBudget
648
+ ? `You have $${remainingBudget.toFixed(4)} remaining in your budget.`
649
+ : "";
650
+
651
+ const continuation = `<Workflow>
652
+ workflow continues until you call one of ${this.requiredToolNames}.\n
653
+ ${timeRemainsingMsg}
654
+ ${turnsRemainingMsg}
655
+ ${budgetRemainingMsg}
656
+ </Workflow>`;
657
+
504
658
  messages.push({
505
659
  role: "user",
506
- content: `<Workflow>workflow continues until you call on of ${this.requiredToolNames}. Any continuation messages should be enclosed in workflow tags to hide intermediate work from users.</Workflow>`,
660
+ content: continuation,
507
661
  });
508
662
  }
509
663
 
@@ -522,7 +676,11 @@ export abstract class BaseAgent implements IAgent {
522
676
  }
523
677
 
524
678
  addPendingUserMessage(message: Message) {
525
- this.pendingUserMessages.push(message);
679
+ if (this.status === this.eventTypes.done) {
680
+ this.resume(JSON.stringify(message.content));
681
+ } else {
682
+ this.pendingUserMessages.push(message);
683
+ }
526
684
  }
527
685
 
528
686
  getMessagesLength(messages: Message[]) {
@@ -17,6 +17,34 @@ You think step by step about the blocks of code you're modifying.
17
17
  You may use the execCommand tool to navigate the filesystem and to create new folders if needed.
18
18
  You may use the execCommand tool to use git to view which changes have been made so far via git diff and git status.
19
19
 
20
+ # Creative Tool Usage Examples
21
+
22
+ Beyond basic file editing, consider these powerful tool combinations:
23
+
24
+ ## String Replace Tool
25
+ - **Bulk renaming**: Use stringReplace across multiple files to rename variables, functions, or imports
26
+ - **Configuration updates**: Replace API endpoints, version numbers, or feature flags across the codebase
27
+ - **Dependency updates**: Update import paths when reorganizing code structure
28
+
29
+ ## YCMD Language Server Integration
30
+ - **Find all references**: Use ycmdGoTo with GoToReferences to find every usage of a function before refactoring
31
+ - **Auto-complete exploration**: Use ycmdCompletion to discover available methods/properties on objects
32
+ - **Smart navigation**: Use ycmdGoTo with GoToDefinition to understand code structure before making changes
33
+ - **Error-driven development**: Use ycmdDiagnostics to identify compilation errors and fix them systematically
34
+ - **Intelligent renaming**: Use ycmdRefactor with RefactorRename for safe symbol renaming across files
35
+
36
+ ## Search and Analysis Workflows
37
+ - **Impact analysis**: Use textSearch + ycmdGoTo to understand how changes will affect the codebase
38
+ - **Pattern discovery**: Use embeddingSearch to find similar code patterns when implementing new features
39
+ - **Code exploration**: Combine fileSearch + readFile + ycmdCompletion to understand unfamiliar codebases
40
+
41
+ ## Advanced Combinations
42
+ - **Refactoring workflow**: ycmdDiagnostics → ycmdGoTo → stringReplace → ycmdDiagnostics (verify fixes)
43
+ - **Feature implementation**: embeddingSearch → ycmdCompletion → patchFile → ycmdDiagnostics
44
+ - **Code cleanup**: textSearch → ycmdRefactor (organize imports) → stringReplace (standardize patterns)
45
+
46
+ Think creatively about tool combinations - each tool can amplify the others' effectiveness!
47
+
20
48
  # PLUGINS REMINDER:
21
49
 
22
50
  Plugins are used to automatically expand user input with more context.
@@ -3,6 +3,7 @@ import { AgentContext } from "./base/base";
3
3
  import { DeveloperAgent } from "./developer/developer";
4
4
  import { PatchingAgent } from "./patcher/patcher";
5
5
  import { ResearcherAgent } from "./researcher/researcher";
6
+ import { SetupAgent } from "./setup/setup";
6
7
 
7
8
  export { BaseAgent } from "./base/base";
8
9
  export { ConfigAgent } from "./configurable/ConfigAgent";
@@ -19,6 +20,7 @@ let singletons = {} as {
19
20
  Developer: DeveloperAgent;
20
21
  Patcher: PatchingAgent;
21
22
  Researcher: ResearcherAgent;
23
+ Setup: SetupAgent;
22
24
  };
23
25
 
24
26
  export function agents(agentContext: AgentContext = services()) {
@@ -27,6 +29,7 @@ export function agents(agentContext: AgentContext = services()) {
27
29
  Developer: new DeveloperAgent(agentContext),
28
30
  Patcher: new PatchingAgent(agentContext),
29
31
  Researcher: new ResearcherAgent(agentContext),
32
+ Setup: new SetupAgent(agentContext),
30
33
  };
31
34
  }
32
35
  return singletons;
@@ -77,13 +77,11 @@ export class PatchingAgent extends BaseAgent {
77
77
 
78
78
  constructor(context: AgentContext) {
79
79
  super(context);
80
- this.disableTool("sendVimInput");
81
- this.disableTool("openFileInVim");
82
80
 
83
81
  this.setModelPreferences([
84
82
  { model: Models.anthropic.Sonnet4, provider: "anthropic" },
85
83
  {
86
- model: Models.openai.GPT_41,
84
+ model: Models.openai.GPT_41_Mini,
87
85
  provider: "openai",
88
86
  },
89
87
  ]);
@@ -98,10 +96,14 @@ export class PatchingAgent extends BaseAgent {
98
96
  ${systemReminder}
99
97
 
100
98
  Specialization: Patcher Agent, ${this.description}
99
+
100
+ # Language Server Integration:
101
+ Use ycmd tools (ycmdDiagnostics, ycmdCompletion, ycmdRefactor, ycmdGoTo) to get error diagnostics, code completions, refactor symbols, and navigate definitions before making changes.
102
+ This helps ensure accurate modifications and can suggest fixes for compilation errors.
103
+
101
104
  IF you fail twice to patch a file, you may switch using writeFileChunk to rewrite the whole file.
102
105
  `,
103
106
  },
104
- // { role: "user", content: systemReminder },
105
107
  { role: "user", content: userInput },
106
108
  ] as Message[];
107
109
  }