@tyvm/knowhow 0.0.33 → 0.0.34

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 +147 -21
  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 +980 -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 +72 -24
  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 +14 -1
  177. package/ts_build/src/agents/base/base.js +91 -17
  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 +56 -0
  291. package/ts_build/src/chat/modules/AgentModule.js +705 -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 +4 -5
  358. package/ts_build/src/plugins/downloader/downloader.js +55 -26
  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
package/src/cli.ts CHANGED
@@ -1,5 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import "source-map-support/register";
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ import * as os from "os";
6
+ import { Command } from "commander";
3
7
  import { generate, embed, upload, chat } from "./index";
4
8
  import { init } from "./config";
5
9
 
@@ -10,59 +14,284 @@ import { services } from "./services";
10
14
  import { login } from "./login";
11
15
  import { worker } from "./worker";
12
16
  import { agents } from "./agents";
17
+ import { startChat2 } from "./chat2";
18
+ import { askAI } from "./chat";
19
+ import { getConfiguredEmbeddingMap, queryEmbedding } from "./embeddings";
20
+ import { getConfig } from "./config";
21
+ import { marked } from "marked";
22
+ import { BaseAgent } from "./agents/base/base";
23
+ import { AskModule } from "./chat/modules/AskModule";
24
+ import { SearchModule } from "./chat/modules/SearchModule";
25
+ import { AgentModule } from "./chat/modules/AgentModule";
26
+ import { readPromptFile } from "./ai";
27
+ import { SetupModule } from "./chat/modules/SetupModule";
28
+ import { CliChatService } from "./chat/CliChatService";
13
29
 
14
- const command = process.argv[2];
15
-
16
- async function main() {
30
+ async function setupServices() {
17
31
  const { Tools, Agents, Mcp, Clients } = services();
18
- const { Researcher, Developer, Patcher } = agents();
32
+ const { Researcher, Developer, Patcher, Setup } = agents();
19
33
  Agents.registerAgent(Researcher);
20
34
  Agents.registerAgent(Patcher);
21
35
  Agents.registerAgent(Developer);
36
+ Agents.registerAgent(Setup);
22
37
  Agents.loadAgentsFromConfig(services());
23
38
 
24
39
  Tools.defineTools(includedTools, allTools);
25
40
 
26
- await Mcp.connectToConfigured(Tools);
27
- await Clients.registerConfiguredModels();
41
+ await Promise.all([
42
+ Mcp.connectToConfigured(Tools),
43
+ Clients.registerConfiguredModels(),
44
+ ]);
45
+ }
46
+
47
+ // Utility function to read from stdin
48
+ async function readStdin(): Promise<string> {
49
+ return new Promise((resolve) => {
50
+ let data = "";
51
+ process.stdin.setEncoding("utf8");
52
+
53
+ if (process.stdin.isTTY) {
54
+ resolve("");
55
+ return;
56
+ }
57
+
58
+ process.stdin.on("readable", () => {
59
+ const chunk = process.stdin.read();
60
+ if (chunk !== null) data += chunk;
61
+ });
62
+
63
+ process.stdin.on("end", () => resolve(data.trim()));
64
+ });
65
+ }
66
+
67
+ async function main() {
68
+ const program = new Command();
69
+ const config = await getConfig();
70
+
71
+ program
72
+ .name("knowhow")
73
+ .description("AI CLI with plugins and agents")
74
+ .version("0.0.33");
28
75
 
29
- // VIMMER is disabled for now
30
- // Agents.registerAgent(Vimmer);
76
+ // Initialize services for all commands
77
+ await setupServices();
31
78
 
32
- switch (command) {
33
- case "init":
79
+ program
80
+ .command("init")
81
+ .description("Initialize knowhow configuration")
82
+ .action(async () => {
34
83
  await init();
35
- break;
36
- case "login":
37
- await login();
38
- break;
39
- case "generate":
84
+ });
85
+
86
+ program
87
+ .command("login")
88
+ .description("Login to knowhow")
89
+ .option("--jwt", "should use JWT login", "true")
90
+ .action(async (opts) => {
91
+ await login(opts.jwt);
92
+ });
93
+
94
+ program
95
+ .command("generate")
96
+ .description("Generate documentation")
97
+ .action(async () => {
40
98
  await generate();
41
- break;
42
- case "embed":
99
+ });
100
+
101
+ program
102
+ .command("embed")
103
+ .description("Create embeddings")
104
+ .action(async () => {
43
105
  await embed();
44
- break;
45
- case "embed:purge":
46
- await purge(process.argv[3]);
47
- break;
48
- case "upload":
106
+ });
107
+
108
+ program
109
+ .command("embed:purge")
110
+ .description("Purge embeddings matching a glob pattern")
111
+ .argument("<pattern>", "Glob pattern to match files for purging")
112
+ .action(async (pattern) => {
113
+ await purge(pattern);
114
+ });
115
+
116
+ program
117
+ .command("upload")
118
+ .description("Upload data")
119
+ .action(async () => {
49
120
  await upload();
50
- break;
51
- case "download":
121
+ });
122
+
123
+ program
124
+ .command("download")
125
+ .description("Download data")
126
+ .action(async () => {
52
127
  await download();
53
- break;
54
- case "chat":
128
+ });
129
+
130
+ program
131
+ .command("chat")
132
+ .description("Start chat interface")
133
+ .action(async () => {
55
134
  await chat();
56
- break;
57
- case "worker":
135
+ });
136
+
137
+ program
138
+ .command("chat2")
139
+ .description("Start new chat interface")
140
+ .action(async () => {
141
+ await startChat2();
142
+ });
143
+
144
+ program
145
+ .command("agent")
146
+ .description("Spin up agents directly from CLI")
147
+ .option(
148
+ "--provider <provider>",
149
+ "AI provider (openai, anthropic, google, xai)",
150
+ "openai"
151
+ )
152
+ .option("--model <model>", "Specific model for the provider")
153
+ .option("--agent-name <name>", "Which agent to use", "Patcher")
154
+ .option(
155
+ "--max-time-limit <minutes>",
156
+ "Time limit for agent execution (minutes)",
157
+ "30"
158
+ )
159
+ .option(
160
+ "--max-spend-limit <dollars>",
161
+ "Cost limit for agent execution (dollars)",
162
+ "10"
163
+ )
164
+ .option("--message-id <messageId>", "Knowhow message ID for task tracking")
165
+ .option("--prompt-file <path>", "Custom prompt template file with {text}")
166
+ .option("--input <text>", "Task input (fallback to stdin if not provided)")
167
+ .action(async (options) => {
168
+ try {
169
+ let input = options.input;
170
+ if (!input) {
171
+ input = await readStdin();
172
+ if (!input) {
173
+ console.error(
174
+ "Error: No input provided. Use --input flag or pipe input via stdin."
175
+ );
176
+ process.exit(1);
177
+ }
178
+ }
179
+
180
+ input = readPromptFile(options.promptFile, input);
181
+ const { taskCompleted } = await new AgentModule().setupAgent({
182
+ ...options,
183
+ input,
184
+ maxTimeLimit: parseInt(options.maxTimeLimit, 10),
185
+ maxSpendLimit: parseFloat(options.maxSpendLimit),
186
+ run: true,
187
+ });
188
+ await taskCompleted;
189
+ } catch (error) {
190
+ console.error("Error running agent:", error);
191
+ process.exit(1);
192
+ }
193
+ });
194
+
195
+ program
196
+ .command("ask")
197
+ .description("Direct AI questioning without agent overhead")
198
+ .option("--provider <provider>", "AI provider to use", "openai")
199
+ .option("--model <model>", "Specific model")
200
+ .option("--input <text>", "Question (fallback to stdin if not provided)")
201
+ .option("--prompt-file <path>", "Custom prompt template file")
202
+ .action(async (options) => {
203
+ try {
204
+ let input = options.input;
205
+ if (!input) {
206
+ input = await readStdin();
207
+ if (!input) {
208
+ console.error(
209
+ "Error: No question provided. Use --input flag or pipe input via stdin."
210
+ );
211
+ process.exit(1);
212
+ }
213
+ }
214
+
215
+ input = readPromptFile(options.promptFile, input);
216
+
217
+ await new AskModule().processAIQuery(input, {
218
+ plugins: config.plugins,
219
+ currentModel: options.model,
220
+ currentProvider: options.provider,
221
+ });
222
+ } catch (error) {
223
+ console.error("Error asking AI:", error);
224
+ process.exit(1);
225
+ }
226
+ });
227
+
228
+ program
229
+ .command("setup")
230
+ .description("Ask the agent to configure knowhow")
231
+ .action(async (options) => {
232
+ try {
233
+ const chatService = new CliChatService(config.plugins);
234
+ const setupModule = new SetupModule();
235
+ await setupModule.initialize(chatService);
236
+ await setupModule.handleSetupCommand([]);
237
+ } catch (error) {
238
+ console.error("Error running agent:", error);
239
+ process.exit(1);
240
+ }
241
+ });
242
+
243
+ program
244
+ .command("search")
245
+ .description("Search embeddings directly from CLI")
246
+ .option(
247
+ "--input <text>",
248
+ "Search query (fallback to stdin if not provided)"
249
+ )
250
+ .option(
251
+ "-e, --embedding <path>",
252
+ "Specific embedding path (default: all)",
253
+ "all"
254
+ )
255
+ .action(async (options) => {
256
+ try {
257
+ let input = options.input;
258
+ if (!input) {
259
+ input = await readStdin();
260
+ if (!input) {
261
+ console.error(
262
+ "Error: No search query provided. Use --input flag or pipe input via stdin."
263
+ );
264
+ process.exit(1);
265
+ }
266
+ }
267
+
268
+ await new SearchModule().searchEmbeddingsCLI(input, options.embedding);
269
+ } catch (error) {
270
+ console.error("Error searching embeddings:", error);
271
+ process.exit(1);
272
+ }
273
+ });
274
+
275
+ program
276
+ .command("sessions")
277
+ .description("Manage agent sessions from CLI")
278
+ .action(async () => {
279
+ try {
280
+ await new AgentModule().logSessionTable();
281
+ } catch (error) {
282
+ console.error("Error listing sessions:", error);
283
+ process.exit(1);
284
+ }
285
+ });
286
+
287
+ program
288
+ .command("worker")
289
+ .description("Start worker process")
290
+ .action(async () => {
58
291
  await worker();
59
- break;
60
- default:
61
- console.log(
62
- "Unknown command. Please use one of the following: init, login, generate, embed, embed:purge, upload, download, chat"
63
- );
64
- break;
65
- }
292
+ });
293
+
294
+ await program.parseAsync(process.argv);
66
295
  }
67
296
 
68
297
  if (require.main === module) {
@@ -14,10 +14,18 @@ import {
14
14
  type MessageParam = Anthropic.MessageParam;
15
15
  type Usage = Anthropic.Usage;
16
16
 
17
- export class GenericAnthropicClient extends Anthropic implements GenericClient {
18
- constructor() {
19
- super({
20
- apiKey: process.env.ANTHROPIC_API_KEY,
17
+ export class GenericAnthropicClient implements GenericClient {
18
+ private client: Anthropic;
19
+ private apiKey?: string;
20
+
21
+ constructor(apiKey?: string) {
22
+ this.setKey(apiKey || process.env.ANTHROPIC_API_KEY || "");
23
+ }
24
+
25
+ setKey(apiKey: string) {
26
+ this.apiKey = apiKey;
27
+ this.client = new Anthropic({
28
+ apiKey: apiKey || process.env.ANTHROPIC_API_KEY,
21
29
  });
22
30
  }
23
31
 
@@ -26,7 +34,6 @@ export class GenericAnthropicClient extends Anthropic implements GenericClient {
26
34
 
27
35
  if (lastTool) {
28
36
  lastTool.cache_control = { type: "ephemeral" };
29
- console.log("caching last tool");
30
37
  }
31
38
  }
32
39
 
@@ -242,7 +249,7 @@ export class GenericAnthropicClient extends Anthropic implements GenericClient {
242
249
 
243
250
  const tools = this.transformTools(options.tools);
244
251
  try {
245
- const response = await this.messages.create({
252
+ const response = await this.client.messages.create({
246
253
  model: options.model,
247
254
  messages: claudeMessages,
248
255
  system: systemMessage
@@ -382,7 +389,7 @@ export class GenericAnthropicClient extends Anthropic implements GenericClient {
382
389
  }
383
390
 
384
391
  async getModels() {
385
- const models = await this.models.list();
392
+ const models = await this.client.models.list();
386
393
  return models.data.map((m) => ({
387
394
  id: m.id,
388
395
  }));
@@ -32,10 +32,18 @@ function getMimeTypeFromUrl(url: string): string {
32
32
  return "image/jpeg";
33
33
  }
34
34
 
35
- export class GenericGeminiClient extends GoogleGenAI implements GenericClient {
36
- constructor() {
37
- super({
38
- apiKey: process.env.GEMINI_API_KEY,
35
+ export class GenericGeminiClient implements GenericClient {
36
+ private client: GoogleGenAI;
37
+ private apiKey?: string;
38
+
39
+ constructor(apiKey?: string) {
40
+ this.setKey(apiKey || process.env.GEMINI_API_KEY || "");
41
+ }
42
+
43
+ setKey(apiKey: string) {
44
+ this.apiKey = apiKey;
45
+ this.client = new GoogleGenAI({
46
+ apiKey: apiKey || process.env.GEMINI_API_KEY,
39
47
  });
40
48
  }
41
49
 
@@ -250,7 +258,7 @@ export class GenericGeminiClient extends GoogleGenAI implements GenericClient {
250
258
 
251
259
  try {
252
260
  await wait(2000);
253
- const response = await this.models.generateContent({
261
+ const response = await this.client.models.generateContent({
254
262
  model: options.model,
255
263
  contents,
256
264
  config: {
@@ -428,7 +436,7 @@ export class GenericGeminiClient extends GoogleGenAI implements GenericClient {
428
436
 
429
437
  async getModels() {
430
438
  try {
431
- const models = await this.models.list();
439
+ const models = await this.client.models.list();
432
440
  return models.page.map((m) => ({
433
441
  id: m.name!,
434
442
  }));
@@ -446,7 +454,7 @@ export class GenericGeminiClient extends GoogleGenAI implements GenericClient {
446
454
  }
447
455
 
448
456
  try {
449
- const googleEmbedding = await this.models.embedContent({
457
+ const googleEmbedding = await this.client.models.embedContent({
450
458
  model: options.model,
451
459
  contents: options.input,
452
460
  });
@@ -23,6 +23,10 @@ export class HttpClient implements GenericClient {
23
23
  this.baseUrl = baseUrl;
24
24
  }
25
25
 
26
+ setKey(key: string) {
27
+ this.setJwt(key);
28
+ }
29
+
26
30
  loadJwtFile(filePath: string) {
27
31
  try {
28
32
  const jwtFile = path.join(process.cwd(), filePath);
@@ -39,15 +43,21 @@ export class HttpClient implements GenericClient {
39
43
  async createChatCompletion(
40
44
  options: CompletionOptions
41
45
  ): Promise<CompletionResponse> {
46
+ const body = {
47
+ ...options,
48
+ model: options.model,
49
+ messages: options.messages,
50
+ max_tokens: options.max_tokens || 3000,
51
+
52
+ ...(options.tools && {
53
+ tools: options.tools,
54
+ tool_choice: "auto",
55
+ }),
56
+ };
57
+
42
58
  const response = await axios.post(
43
59
  `${this.baseUrl}/v1/chat/completions`,
44
- {
45
- model: options.model,
46
- messages: options.messages,
47
- max_tokens: options.max_tokens,
48
- tools: options.tools,
49
- tool_choice: options.tool_choice,
50
- },
60
+ body,
51
61
  {
52
62
  headers: this.headers,
53
63
  }
@@ -12,6 +12,8 @@ import { HttpClient } from "./http";
12
12
  import { EmbeddingModels, Models } from "../types";
13
13
  import { getConfig } from "../config";
14
14
  import { GenericXAIClient } from "./xai";
15
+ import { KnowhowGenericClient } from "./knowhow";
16
+ import { loadKnowhowJwt } from "../services/KnowhowClient";
15
17
 
16
18
  function envCheck(key: string): boolean {
17
19
  const value = process.env[key];
@@ -31,6 +33,7 @@ export class AIClient {
31
33
 
32
34
  ...(envCheck("GEMINI_API_KEY") && { google: new GenericGeminiClient() }),
33
35
  ...(envCheck("XAI_API_KEY") && { xai: new GenericXAIClient() }),
36
+ ...(loadKnowhowJwt() && { knowhow: new KnowhowGenericClient() }),
34
37
  };
35
38
 
36
39
  completionModels = {
@@ -101,6 +104,12 @@ export class AIClient {
101
104
  this.clients[provider] = client;
102
105
  }
103
106
 
107
+ setKey(provider: string, apiKey: string) {
108
+ const { client } = this.getClient(provider); // Ensure provider is registered
109
+ client.setKey(apiKey);
110
+ this.clients[provider].setKey(apiKey);
111
+ }
112
+
104
113
  async registerConfiguredModels() {
105
114
  const config = await getConfig();
106
115
  const modelProviders = config.modelProviders || [];
@@ -115,9 +124,7 @@ export class AIClient {
115
124
  this.registerClient(modelProvider.provider, client);
116
125
 
117
126
  try {
118
- const models = await client.getModels();
119
- const ids = models.map((model) => model.id);
120
- this.registerModels(modelProvider.provider, ids);
127
+ await this.loadProviderModels(modelProvider.provider);
121
128
  } catch (error) {
122
129
  console.error(
123
130
  `Failed to register models for provider ${modelProvider.provider}:`,
@@ -127,6 +134,23 @@ export class AIClient {
127
134
  }
128
135
  }
129
136
 
137
+ async loadProviderModels(provider: string) {
138
+ if (!this.clients[provider]) {
139
+ throw new Error(`Provider ${provider} not registered.`);
140
+ }
141
+
142
+ try {
143
+ const models = await this.clients[provider].getModels();
144
+ const ids = models.map((model) => model.id);
145
+ this.registerModels(provider, ids);
146
+ } catch (error) {
147
+ console.error(
148
+ `Failed to load models for provider ${provider}:`,
149
+ error.message
150
+ );
151
+ }
152
+ }
153
+
130
154
  registerModels(provider: string, models: string[]) {
131
155
  const currentModels = this.clientModels[provider] || [];
132
156
  const currentCompletionModels = this.completionModels[provider] || [];
@@ -140,6 +164,21 @@ export class AIClient {
140
164
  );
141
165
  }
142
166
 
167
+ /*
168
+ * Some clients support multiple providers, most clients are single provider
169
+ * For the mult-provider clients, we register them with this method
170
+ * TODO: currently registering overwrites any existing providers, but a fallback list could be useful
171
+ */
172
+ registerClientProviderModels(
173
+ client: GenericClient,
174
+ providerModels: Record<string, string[]>
175
+ ) {
176
+ for (const [provider, models] of Object.entries(providerModels)) {
177
+ this.registerClient(provider, client);
178
+ this.registerModels(provider, models);
179
+ }
180
+ }
181
+
143
182
  registerEmbeddingModels(provider: string, models: string[]) {
144
183
  const currentModels = this.clientModels[provider] || [];
145
184
  const currentEmbeddingModels = this.embeddingModels[provider] || [];
@@ -175,7 +214,7 @@ export class AIClient {
175
214
  return { provider, model };
176
215
  }
177
216
 
178
- if (model.includes("/")) {
217
+ if (model?.includes("/")) {
179
218
  const split = model.split("/");
180
219
 
181
220
  const inferredProvider = split[0];
@@ -206,6 +245,13 @@ export class AIClient {
206
245
  options: CompletionOptions
207
246
  ): Promise<CompletionResponse> {
208
247
  const { client, model } = this.getClient(provider, options.model);
248
+ if (!model || !client) {
249
+ throw new Error(
250
+ `provider: ${provider} does not have ${
251
+ options.model
252
+ } model registered. Try using ${JSON.stringify(this.listAllModels())}`
253
+ );
254
+ }
209
255
  return client.createChatCompletion({ ...options, model });
210
256
  }
211
257
 
@@ -214,6 +260,13 @@ export class AIClient {
214
260
  options: EmbeddingOptions
215
261
  ): Promise<EmbeddingResponse> {
216
262
  const { client, model } = this.getClient(provider, options.model);
263
+ if (!model || !client) {
264
+ throw new Error(
265
+ `provider: ${provider} does not have ${
266
+ options.model
267
+ } model registered. Try using ${JSON.stringify(this.listAllModels())}`
268
+ );
269
+ }
217
270
  return client.createEmbedding({ ...options, model });
218
271
  }
219
272
 
@@ -225,6 +278,65 @@ export class AIClient {
225
278
  return this.clientModels;
226
279
  }
227
280
 
281
+ listAllModelsWithProvider() {
282
+ return Object.entries(this.listAllModels())
283
+ .map(([provider, models]) =>
284
+ models.map((m) => ({ id: `${provider}/${m}` }))
285
+ )
286
+ .flat();
287
+ }
288
+
289
+ /*
290
+ *
291
+ * some clients return models in the format "provider/model_name"
292
+ * this function parses those models into our {provider, model} format
293
+ * then creates a provider -> [models] map
294
+ * the models will not have the provider prefix
295
+ *
296
+ * if the client doesn't return models in that format, use knownProvider
297
+ * to set the provider
298
+ */
299
+ async parseProviderPrefixedModels(
300
+ client: GenericClient,
301
+ knownProvider = ""
302
+ ): Promise<Record<string, string[]>> {
303
+ const models = await client.getModels();
304
+ const providerModels = models
305
+ .map((m) => {
306
+ if (knownProvider) {
307
+ return {
308
+ provider: knownProvider,
309
+ model: m.id,
310
+ };
311
+ }
312
+
313
+ const splitModel = m.id.split("/");
314
+
315
+ if (splitModel.length < 2) {
316
+ console.error(`Cannot parse model format: ${m.id}`);
317
+ }
318
+
319
+ const provider = splitModel.length > 1 ? splitModel[0] : "";
320
+ const modelName = splitModel.slice(1).join("/");
321
+ return {
322
+ provider,
323
+ model: modelName,
324
+ };
325
+ })
326
+ .reduce((acc, { provider, model }) => {
327
+ acc[provider] = acc[provider] || [];
328
+ acc[provider].push(model);
329
+ return acc;
330
+ }, {});
331
+
332
+ for (const provider in providerModels) {
333
+ if (!providerModels[provider].length) {
334
+ delete providerModels[provider];
335
+ }
336
+ }
337
+ return providerModels;
338
+ }
339
+
228
340
  listAllEmbeddingModels() {
229
341
  return this.embeddingModels;
230
342
  }
@@ -248,3 +360,4 @@ export * from "./anthropic";
248
360
  export * from "./knowhow";
249
361
  export * from "./gemini";
250
362
  export * from "./xai";
363
+ export * from "./knowhowMcp";
@@ -7,11 +7,16 @@ import {
7
7
  } from "./types";
8
8
  import { KnowhowSimpleClient } from "../services/KnowhowClient";
9
9
 
10
+ const envUrl = process.env.KNOWHOW_API_URL;
10
11
  export class KnowhowGenericClient implements GenericClient {
11
12
  private client: KnowhowSimpleClient;
12
13
 
13
- constructor(baseUrl: string, jwt?: string) {
14
- this.client = new KnowhowSimpleClient(baseUrl, jwt);
14
+ constructor(private baseUrl = envUrl, jwt?: string) {
15
+ this.setKey(jwt);
16
+ }
17
+
18
+ setKey(jwt: string): void {
19
+ this.client = new KnowhowSimpleClient(this.baseUrl, jwt);
15
20
  }
16
21
 
17
22
  async createChatCompletion(