@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
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Ask Chat Module - Handles basic AI question/answer functionality
3
+ */
4
+
5
+ import { BaseChatModule } from "./BaseChatModule";
6
+ import { ChatCommand, ChatMode, ChatContext } from "../types";
7
+ import { ChatInteraction } from "../../types";
8
+ import { Models } from "../../ai";
9
+ import { services } from "../../services/index";
10
+ import { Plugins } from "../../plugins/plugins";
11
+ import { Marked } from "../../utils/index";
12
+ import { formatChatInput } from "../../chat";
13
+
14
+ export class AskModule extends BaseChatModule {
15
+ name = "ask";
16
+ description = "Basic AI question/answer functionality";
17
+
18
+ getCommands(): ChatCommand[] {
19
+ return [
20
+ // AskModule provides chat functionality, commands are handled by SystemModule
21
+ ];
22
+ }
23
+
24
+ getModes(): ChatMode[] {
25
+ return [
26
+ {
27
+ name: "chat",
28
+ description: "Basic AI chat mode",
29
+ active: true,
30
+ },
31
+ ];
32
+ }
33
+
34
+ async handleInput(input: string, context: ChatContext): Promise<boolean> {
35
+ // AskModule is the default handler - it handles input when no other module does
36
+ // Skip if in agent mode (let AgentModule handle it)
37
+ if (context.mode === "agent") {
38
+ return false;
39
+ }
40
+
41
+ // This is the default handler for all non-command input
42
+ return await this.processAIQuery(input, context);
43
+ }
44
+
45
+ /**
46
+ * Process AI query with full chat functionality (like original chat.ts)
47
+ */
48
+ public async processAIQuery(
49
+ input: string,
50
+ context: ChatContext
51
+ ): Promise<boolean> {
52
+ try {
53
+ const { Clients } = services();
54
+ const provider = context.currentProvider || "openai";
55
+ const model = context.currentModel || Models.openai.GPT_4o;
56
+
57
+ // Format the input with plugin context and chat history like original chat.ts
58
+ const formattedPrompt = await formatChatInput(
59
+ input,
60
+ context.plugins || [],
61
+ context.chatHistory || []
62
+ );
63
+
64
+ // Get AI response using the same pattern as original chat.ts
65
+ const response = await Clients.createCompletion(provider, {
66
+ messages: [
67
+ {
68
+ role: "system",
69
+ content:
70
+ "Helpful Codebase assistant. Answer users questions using the embedding data that is provided with the user's question. You have limited access to the codebase based off of how similar the codebase is to the user's question. You may reference file paths by using the IDs present in the embedding data, but be sure to remove the chunk from the end of the filepaths.",
71
+ },
72
+ { role: "user", content: formattedPrompt },
73
+ ],
74
+ model,
75
+ });
76
+
77
+ const result =
78
+ response.choices[0].message.content || "No response from the AI";
79
+
80
+ // Create interaction with proper ChatInteraction structure (input/output)
81
+ const interaction: ChatInteraction = {
82
+ input,
83
+ output: result,
84
+ } as ChatInteraction;
85
+
86
+ context.chatHistory?.push(interaction);
87
+
88
+ // Display the result using Marked parser like in original chat.ts
89
+ console.log(Marked.parse(result));
90
+
91
+ return true;
92
+ } catch (error) {
93
+ console.error("Error getting AI response:", error);
94
+ console.log("Failed to get AI response. Please try again.");
95
+ return false;
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Base Chat Module - Abstract base class for all chat modules
3
+ */
4
+
5
+ import {
6
+ ChatModule,
7
+ ChatService,
8
+ ChatCommand,
9
+ ChatMode,
10
+ ChatContext,
11
+ } from "../types";
12
+
13
+ export abstract class BaseChatModule implements ChatModule {
14
+ public abstract name: string;
15
+ public abstract description: string;
16
+ public commands: ChatCommand[] = [];
17
+ public modes: ChatMode[] = [];
18
+
19
+ protected chatService!: ChatService;
20
+
21
+ async initialize(service: ChatService): Promise<void> {
22
+ this.chatService = service;
23
+ this.commands = this.getCommands();
24
+ this.modes = this.getModes();
25
+
26
+ // Register all commands with the ChatService
27
+ for (const command of this.commands) {
28
+ this.chatService.registerCommand(command);
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Override this method to provide commands
34
+ */
35
+ public getCommands(): ChatCommand[] {
36
+ return [];
37
+ }
38
+
39
+ /**
40
+ * Override this method to provide modes
41
+ */
42
+ public getModes(): ChatMode[] {
43
+ return [];
44
+ }
45
+
46
+ /**
47
+ * Override this method to handle non-command input
48
+ */
49
+ async handleInput(input: string, context: ChatContext): Promise<boolean> {
50
+ return false; // Default: don't handle input
51
+ }
52
+
53
+ /**
54
+ * Override this method for cleanup
55
+ */
56
+ async cleanup(): Promise<void> {
57
+ // Default: no cleanup needed
58
+ }
59
+
60
+ /**
61
+ * Helper method to update context
62
+ */
63
+ protected updateContext(updates: Partial<ChatContext>): void {
64
+ this.chatService.setContext(updates);
65
+ }
66
+ }
@@ -0,0 +1,174 @@
1
+ import { ChatModule } from "../types";
2
+ import { CliChatService } from "../CliChatService";
3
+ import { AgentModule } from "./AgentModule";
4
+ import { ChatCommand, ChatMode, ChatContext } from "../types";
5
+ import { AskModule } from "./AskModule";
6
+ import { SearchModule } from "./SearchModule";
7
+ import { VoiceModule } from "./VoiceModule";
8
+ import { SystemModule } from "./SystemModule";
9
+ import { SetupModule } from "./SetupModule";
10
+
11
+ export class InternalChatModule implements ChatModule {
12
+ private chatService?: CliChatService;
13
+ name = "internal";
14
+ description = "Internal chat module aggregating all functionality";
15
+ commands: ChatCommand[] = [];
16
+ modes: ChatMode[] = [];
17
+ private agentModule = new AgentModule();
18
+ private askModule = new AskModule();
19
+ private searchModule = new SearchModule();
20
+ private voiceModule = new VoiceModule();
21
+ private systemModule = new SystemModule();
22
+ private setupModule = new SetupModule();
23
+
24
+ async initialize(chatService: CliChatService): Promise<void> {
25
+ this.chatService = chatService;
26
+
27
+ // Register this module first so it gets called for input handling
28
+ chatService.registerModule(this);
29
+
30
+ // Initialize all sub-modules
31
+ await this.agentModule.initialize(chatService);
32
+ await this.askModule.initialize(chatService);
33
+ await this.searchModule.initialize(chatService);
34
+ await this.voiceModule.initialize(chatService);
35
+ await this.systemModule.initialize(chatService);
36
+ await this.setupModule.initialize(chatService);
37
+
38
+ // Register our own commands (exit and multi) - not duplicated by BaseChatModule
39
+ chatService.registerCommand({
40
+ name: "exit",
41
+ description: "Exit the chat",
42
+ handler: this.handleExitCommand.bind(this),
43
+ });
44
+
45
+ chatService.registerCommand({
46
+ name: "multi",
47
+ description: "Toggle multiline mode",
48
+ handler: this.handleMultiCommand.bind(this),
49
+ });
50
+
51
+
52
+ for (const mode of this.getModes()) {
53
+ chatService.registerMode(mode);
54
+ }
55
+ }
56
+
57
+ getCommands(): ChatCommand[] {
58
+ const commands: ChatCommand[] = [
59
+ ...this.agentModule.getCommands(),
60
+ ...this.askModule.getCommands(),
61
+ ...this.searchModule.getCommands(),
62
+ ...this.voiceModule.getCommands(),
63
+ ...this.systemModule.getCommands(),
64
+ ...this.setupModule.getCommands(),
65
+ {
66
+ name: "exit",
67
+ description: "Exit the chat",
68
+ handler: this.handleExitCommand.bind(this),
69
+ },
70
+ {
71
+ name: "multi",
72
+ description: "Toggle multiline mode",
73
+ handler: this.handleMultiCommand.bind(this),
74
+ },
75
+ ];
76
+ return commands;
77
+ }
78
+
79
+ getModes(): ChatMode[] {
80
+ return [
81
+ ...this.agentModule.getModes(),
82
+ ...this.askModule.getModes(),
83
+ ...this.searchModule.getModes(),
84
+ ...this.voiceModule.getModes(),
85
+ ...this.systemModule.getModes(),
86
+ ...this.setupModule.getModes(),
87
+ ];
88
+ }
89
+
90
+ async handleExitCommand(args: string[]): Promise<void> {
91
+ console.log("Goodbye!");
92
+ process.exit(0);
93
+ }
94
+
95
+ async handleMultiCommand(args: string[]): Promise<void> {
96
+ const context = this.chatService?.getContext();
97
+ const newMultiMode = !context?.multilineMode;
98
+ this.chatService?.setContext({ multilineMode: newMultiMode });
99
+ console.log(`Multiline mode: ${newMultiMode ? "enabled" : "disabled"}`);
100
+ }
101
+
102
+ /**
103
+ * Check if input matches a known command without prefix and suggest using the prefix
104
+ */
105
+ private checkForFuzzyCommand(input: string): boolean {
106
+ if (!this.chatService) return false;
107
+
108
+ const trimmedInput = input.toLowerCase().trim();
109
+ const availableCommands = this.chatService.getCommands();
110
+
111
+ // Check if the input matches any command name exactly (case-insensitive)
112
+ const matchingCommand = availableCommands.find(
113
+ (cmd) =>
114
+ cmd.name.toLowerCase() === trimmedInput ||
115
+ trimmedInput.startsWith(cmd.name.toLowerCase() + " ")
116
+ );
117
+
118
+ if (matchingCommand) {
119
+ console.log(
120
+ `Did you mean "/${matchingCommand.name}"? Commands must start with "/"`
121
+ );
122
+ console.log(
123
+ `Available commands: ${availableCommands
124
+ .map((cmd) => `/${cmd.name}`)
125
+ .join(", ")}`
126
+ );
127
+ return true;
128
+ }
129
+
130
+ return false;
131
+ }
132
+
133
+ async handleInput(input: string, context: ChatContext): Promise<boolean> {
134
+ // Check for fuzzy command matches first to prevent agent calls
135
+ // This prevents accidental agent calls when user types commands without "/"
136
+ if (this.checkForFuzzyCommand(input)) {
137
+ return true; // Command suggestion shown, input handled
138
+ }
139
+
140
+ // If in agent mode, check if this looks like a command before calling agent
141
+ if (
142
+ context.agentMode &&
143
+ input
144
+ .toLowerCase()
145
+ .match(
146
+ /^(multi|agent|ask|search|voice|system|exit|setup|help|clear)(\s|$)/i
147
+ )
148
+ ) {
149
+ return this.checkForFuzzyCommand(input); // Will show suggestion and return true
150
+ }
151
+
152
+ // Try agent module first (handles agent mode)
153
+ if (await this.agentModule.handleInput(input, context)) {
154
+ return true;
155
+ }
156
+
157
+ // Try search module
158
+ if (await this.searchModule.handleInput(input, context)) {
159
+ return true;
160
+ }
161
+
162
+ // Try voice module
163
+ if (await this.voiceModule.handleInput(input, context)) {
164
+ return true;
165
+ }
166
+
167
+ // Default to ask module (handles all non-command input when not in agent mode)
168
+ return await this.askModule.handleInput(input, context);
169
+ }
170
+
171
+ async cleanup(): Promise<void> {
172
+ // No cleanup needed
173
+ }
174
+ }
@@ -0,0 +1,166 @@
1
+ import { BaseChatModule } from "./BaseChatModule";
2
+ import { ChatContext, ChatCommand } from "../types";
3
+ import { getConfiguredEmbeddingMap, queryEmbedding } from "../../embeddings";
4
+ import { getConfig } from "../../config";
5
+ import { ask } from "../../utils";
6
+ import { marked } from "marked";
7
+
8
+ export class SearchModule extends BaseChatModule {
9
+ name = "Search";
10
+ description = "Search through embeddings for relevant information";
11
+
12
+ getCommands(): ChatCommand[] {
13
+ return [
14
+ {
15
+ name: "search",
16
+ description: "Search embeddings",
17
+ handler: this.handleSearchCommand.bind(this),
18
+ },
19
+ ];
20
+ }
21
+
22
+ async handleSearchCommand(args: string[]): Promise<void> {
23
+ await this.askEmbedding("searching");
24
+ }
25
+
26
+ async executeCommand(command: string, context: ChatContext): Promise<void> {
27
+ if (command === "search") {
28
+ await this.askEmbedding("searching");
29
+ }
30
+ }
31
+
32
+ async askEmbedding(promptText: string) {
33
+ const options = ["next", "exit", "embeddings", "use"];
34
+ console.log(`Commands: ${options.join(", ")}`);
35
+ let input = await ask(promptText + ": ", options);
36
+ let answer: any | undefined;
37
+ let results = new Array<any>();
38
+ let embedMap = await getConfiguredEmbeddingMap();
39
+ const config = await getConfig();
40
+ const files = Object.keys(embedMap);
41
+
42
+ while (input !== "exit") {
43
+ const embeddings = Object.values(embedMap).flat();
44
+
45
+ switch (input) {
46
+ case "next":
47
+ answer = results.shift();
48
+ break;
49
+ case "embeddings":
50
+ console.log(files);
51
+ break;
52
+ case "use":
53
+ const searchOptions = ["all", ...files];
54
+ console.log(searchOptions);
55
+ const embeddingName = await ask(
56
+ "Embedding to search: ",
57
+ searchOptions
58
+ );
59
+ if (embeddingName === "all") {
60
+ embedMap = await getConfiguredEmbeddingMap();
61
+ break;
62
+ }
63
+
64
+ embedMap = { ...{ [embeddingName]: embedMap[embeddingName] } };
65
+ break;
66
+ default:
67
+ results = await queryEmbedding(
68
+ input,
69
+ embeddings,
70
+ config.embeddingModel
71
+ );
72
+ answer = results.shift();
73
+ break;
74
+ }
75
+ if (answer) {
76
+ console.log(
77
+ marked.parse(
78
+ "### TEXT \n" +
79
+ answer.text +
80
+ "\n### METADATA \n" +
81
+ JSON.stringify(answer.metadata, null, 2)
82
+ )
83
+ );
84
+ }
85
+
86
+ input = await ask(promptText + ": ");
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Search embeddings for CLI usage
92
+ */
93
+ public async searchEmbeddingsCLI(
94
+ query: string,
95
+ embeddingPath?: string
96
+ ): Promise<void> {
97
+ try {
98
+ const config = await getConfig();
99
+ let embedMap = await getConfiguredEmbeddingMap();
100
+
101
+ console.log(`🔍 Searching embeddings for: "${query}"`);
102
+ console.log(`📂 Embedding scope: ${embeddingPath || "all"}`);
103
+ console.log("─".repeat(50));
104
+
105
+ // If specific embedding path is requested, filter to that one
106
+ if (embeddingPath && embeddingPath !== "all") {
107
+ if (embedMap[embeddingPath]) {
108
+ embedMap = { [embeddingPath]: embedMap[embeddingPath] };
109
+ } else {
110
+ console.log("No results found.");
111
+ return;
112
+ }
113
+ }
114
+
115
+ const embeddings = Object.values(embedMap).flat();
116
+
117
+ const results = await queryEmbedding(
118
+ query,
119
+ embeddings,
120
+ config.embeddingModel
121
+ );
122
+
123
+ if (results && results.length > 0) {
124
+ results.slice(0, 5).forEach((result, index) => {
125
+ const metadata = result.metadata as any;
126
+ console.log(`\n${index + 1}. ${result.id}`);
127
+ console.log(
128
+ ` Metadata: ${JSON.stringify(
129
+ result.metadata || {},
130
+ null,
131
+ 2
132
+ ).slice(0, 100)}`
133
+ );
134
+ console.log(
135
+ `Content: \n${result.text?.substring(0, 500)}${
136
+ result.text?.length > 500 ? "..." : ""
137
+ }`
138
+ );
139
+ });
140
+ } else {
141
+ console.log("No results found.");
142
+ }
143
+ } catch (error) {
144
+ console.error("Error searching embeddings:", error);
145
+ throw error;
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Show embedding selection menu
151
+ */
152
+ private async showEmbeddingSelectionMenu(): Promise<string[]> {
153
+ const embedMap = await getConfiguredEmbeddingMap();
154
+ const files = Object.keys(embedMap);
155
+ const searchOptions = ["all", ...files];
156
+
157
+ console.log("Available embeddings:");
158
+ searchOptions.forEach((option, index) => {
159
+ console.log(` ${index + 1}. ${option}`);
160
+ });
161
+
162
+ const embeddingName = await ask("Embedding to search: ", searchOptions);
163
+
164
+ return embeddingName === "all" ? files : [embeddingName];
165
+ }
166
+ }
@@ -0,0 +1,185 @@
1
+ import { services } from "../../services";
2
+ import { login } from "../../login";
3
+ import { ask } from "../../utils";
4
+ import { CliChatService } from "../CliChatService";
5
+ import { ChatCommand, ChatMode } from "../types";
6
+ import { AgentModule } from "./AgentModule";
7
+ import { BaseChatModule } from "./BaseChatModule";
8
+
9
+ export class SetupModule extends BaseChatModule {
10
+ name = "setup";
11
+ description = "Setup commands";
12
+ private agentModule?: AgentModule;
13
+
14
+ getCommands(): ChatCommand[] {
15
+ return [
16
+ {
17
+ name: "setup",
18
+ description: "Check environment setup and run Setup agent",
19
+ handler: this.handleSetupCommand.bind(this),
20
+ },
21
+ ];
22
+ }
23
+
24
+ getModes(): ChatMode[] {
25
+ return [];
26
+ }
27
+
28
+ async initialize(chatService: CliChatService): Promise<void> {
29
+ await super.initialize(chatService);
30
+ // We'll need access to AgentModule for launching Setup agent
31
+ this.agentModule = new AgentModule();
32
+ await this.agentModule.initialize(chatService);
33
+ }
34
+
35
+ /**
36
+ * Check environment variables and show setup status
37
+ */
38
+ private async checkEnvironmentSetup(): Promise<{
39
+ available: string[];
40
+ missing: string[];
41
+ setupNeeded: boolean;
42
+ }> {
43
+ const envCheck = (varName: string): boolean => {
44
+ return !!process.env[varName];
45
+ };
46
+
47
+ const envChecks = [
48
+ {
49
+ name: "OpenAI",
50
+ vars: ["OPENAI_KEY"],
51
+ feature: "OpenAI models (GPT-4o, etc.)",
52
+ },
53
+ {
54
+ name: "Anthropic",
55
+ vars: ["ANTHROPIC_API_KEY"],
56
+ feature: "Claude models",
57
+ },
58
+ { name: "Google", vars: ["GEMINI_API_KEY"], feature: "Gemini models" },
59
+ { name: "XAI", vars: ["XAI_API_KEY"], feature: "Grok models" },
60
+ {
61
+ name: "GitHub",
62
+ vars: ["GITHUB_TOKEN"],
63
+ feature: "GitHub integration (PRs, issues, repos)",
64
+ },
65
+ {
66
+ name: "Linear",
67
+ vars: ["LINEAR_API_KEY"],
68
+ feature: "Linear integration",
69
+ },
70
+ {
71
+ name: "Asana",
72
+ vars: ["ASANA_ACCESS_TOKEN"],
73
+ feature: "Asana integration",
74
+ },
75
+ {
76
+ name: "Jira",
77
+ vars: ["JIRA_HOST", "JIRA_USER", "JIRA_PASSWORD"],
78
+ feature: "Jira integration",
79
+ },
80
+ { name: "Notion", vars: ["NOTION_TOKEN"], feature: "Notion integration" },
81
+ {
82
+ name: "Google Search",
83
+ vars: ["GOOGLE_SEARCH_API_KEY"],
84
+ feature: "Google Search",
85
+ },
86
+ ];
87
+
88
+ const available: string[] = [];
89
+ const missing: string[] = [];
90
+
91
+ for (const check of envChecks) {
92
+ const missingEnv = check.vars.filter((varName) => !process.env[varName]);
93
+ if (!missingEnv.length) {
94
+ available.push(`✅ ${check.name}: ${check.feature}`);
95
+ } else {
96
+ missing.push(
97
+ `❌ ${check.name}: ${check.feature} (missing: ${missingEnv.join(
98
+ " and "
99
+ )})`
100
+ );
101
+ }
102
+ }
103
+
104
+ const canLogin = await this.checkKnowhowLogin();
105
+ if (canLogin) {
106
+ available.push("✅ Knowhow: Logged in successfully");
107
+ } else {
108
+ missing.push("❌ Knowhow: Not logged in");
109
+ }
110
+
111
+ const models = await this.canGetKnowhowModels();
112
+ if (models && models.length > 0) {
113
+ available.push(
114
+ `✅ Knowhow: ${models.length} Models available: ${models
115
+ .slice(0, 3)
116
+ .join(", ")}...`
117
+ );
118
+ } else {
119
+ missing.push("❌ Knowhow: No models available");
120
+ }
121
+
122
+ return { available, missing, setupNeeded: missing.length > 0 };
123
+ }
124
+
125
+ async checkKnowhowLogin(): Promise<boolean> {
126
+ try {
127
+ const canLogin = await login();
128
+ return true;
129
+ } catch (error) {
130
+ return false;
131
+ }
132
+ }
133
+
134
+ async canGetKnowhowModels() {
135
+ const { Clients } = services();
136
+ const models = await Clients.loadProviderModels("knowhow");
137
+ return Clients.getRegisteredModels("knowhow");
138
+ }
139
+
140
+ async handleSetupCommand(args: string[]): Promise<void> {
141
+ console.log("\n🔧 Knowhow Environment Setup Status\n");
142
+
143
+ const { available, missing, setupNeeded } =
144
+ await this.checkEnvironmentSetup();
145
+
146
+ console.log("📋 Available Features:");
147
+ available.forEach((item) => console.log(` ${item}`));
148
+
149
+ if (missing.length > 0) {
150
+ console.log("\n⚠️ Missing Features:");
151
+ missing.forEach((item) => console.log(` ${item}`));
152
+ }
153
+
154
+ if (setupNeeded) {
155
+ console.log(
156
+ "\n💡 To enable missing features, set the required environment variables."
157
+ );
158
+
159
+ const proceedSetup = await ask(
160
+ "\nWould you like me to help you set up your configuration? (y/n): ",
161
+ ["y", "n"]
162
+ );
163
+
164
+ if (
165
+ proceedSetup.toLowerCase() === "y" ||
166
+ proceedSetup.toLowerCase() === "yes"
167
+ ) {
168
+ // Launch Setup agent to guide user through configuration
169
+ if (this.agentModule) {
170
+ const { taskId, agent } = await this.agentModule.setupAgent({
171
+ agentName: "Setup",
172
+ run: true,
173
+ input:
174
+ "Help me set up my Knowhow configuration with the missing features and optimize my setup.",
175
+ });
176
+ await this.agentModule.attachedAgentChatLoop(taskId, agent);
177
+ }
178
+ }
179
+ } else {
180
+ console.log(
181
+ "\n🎉 Great! All major features are available. Your setup looks good!"
182
+ );
183
+ }
184
+ }
185
+ }