@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,376 @@
1
+ export default `
2
+
3
+ Here is an overview of examples from various \`.knowhow/knowhow.json\` configuration files found, illustrating the configuration capabilities that Knowhow supports:
4
+
5
+ ---
6
+
7
+ ## General Configuration Template
8
+
9
+ \`\`\`json
10
+ {
11
+ "promptsDir": ".knowhow/prompts",
12
+ "plugins": [
13
+ "embeddings",
14
+ "language",
15
+ "vim",
16
+ "github",
17
+ "asana",
18
+ "jira",
19
+ "linear",
20
+ "download",
21
+ "figma"
22
+ ],
23
+ "sources": [
24
+ {
25
+ "input": "src/**/*.mdx",
26
+ "output": ".knowhow/docs/",
27
+ "prompt": "BasicCodeDocumenter"
28
+ }
29
+ ],
30
+
31
+ // Generate embeddings from a series of files on your machine
32
+ // Remote knowhow with the kb id allows you to leverage knowhow upload
33
+ "embedSources": [
34
+ {
35
+ "input": ".knowhow/docs/**/*.mdx",
36
+ "output": ".knowhow/embeddings",
37
+ "chunkSize": 2000,
38
+ "remoteType": "knowhow",
39
+ "remoteId": "141d9c4d-1589-4ccc-bf39-031f4259b89f"
40
+ }
41
+ ],
42
+
43
+ // Define aditional agents you can interact with via chat
44
+ "agents": [
45
+ {
46
+ "name": "linter",
47
+ "description": "Clean up your code",
48
+ "instructions": "Read the files that are loaded via vim plugin and provide debugging and linter suggestions"
49
+ }
50
+ {
51
+ "name": "Codebase Helper",
52
+ "description": "Helps you code",
53
+ "instructions": "Codebase helper, use files and tools to help us code",
54
+ "model": "gpt-4-1106-preview",
55
+ "tools": [
56
+ {
57
+ "type": "code_interpreter"
58
+ }
59
+ ],
60
+ "files": [
61
+ ".knowhow/docs/**/*.mdx"
62
+ ]
63
+ }
64
+ ]
65
+ }
66
+ \`\`\`
67
+
68
+ ## Video Download Support
69
+ \`\`\`json
70
+ "embedSources": [
71
+ {
72
+ "input": "https://www.youtube.com/shorts/BYuMBK5Ll-s",
73
+ "output": ".knowhow/embeddings/video.json",
74
+ "chunkSize": 2000,
75
+ "kind": "download"
76
+ }
77
+ ],
78
+ \`\`\`
79
+
80
+ ## MCP Setup
81
+
82
+ \`\`\`json
83
+ "mcps": [
84
+ {
85
+ "name": "browser",
86
+ "command": "npx",
87
+ "args": ["-y", "@modelcontextprotocol/server-puppeteer"]
88
+ }
89
+ ],
90
+ \`\`\`
91
+
92
+ ## Expose Tools to Knowhow Site via workers
93
+ After you've connected via \`knowhow login\` you can connect tools from your local machine
94
+ Run \`knowhow worker\` to generate a block like below. Edit it to include the tools you want to expose.
95
+ Then run \`knowhow worker\` again to connect
96
+ \`\`\`json
97
+ "worker": {
98
+ "allowedTools": [
99
+ "embeddingSearch",
100
+ "finalAnswer",
101
+ "callPlugin",
102
+ "readFile",
103
+ "readBlocks",
104
+ "patchFile",
105
+ "lintFile",
106
+ "textSearch",
107
+ "fileSearch",
108
+ "writeFileChunk",
109
+ "createAiCompletion",
110
+ "listAllModels",
111
+ "listAllProviders",
112
+ "getPullRequest",
113
+ "getPullRequestBuildStatuses",
114
+ "getRunLogs",
115
+ "getPullRequestBuildFailureLogs",
116
+ "addLanguageTerm",
117
+ "getAllLanguageTerms",
118
+ "lookupLanguageTerm",
119
+ "mcp_0_puppeteer_navigate",
120
+ "mcp_0_puppeteer_screenshot",
121
+ "mcp_0_puppeteer_click",
122
+ "mcp_0_puppeteer_fill",
123
+ "mcp_0_puppeteer_select",
124
+ "mcp_0_puppeteer_hover",
125
+ "mcp_0_puppeteer_evaluate"
126
+ ]
127
+ },
128
+ \`\`\`
129
+
130
+ ## Custom Models Via LMS Studio
131
+ \`\`\`json
132
+ "modelProviders": [
133
+ {
134
+ "url": "http://localhost:1234",
135
+ "provider": "lms"
136
+ }
137
+ ],
138
+ \`\`\`
139
+
140
+ ## Agent Tasks: rename all video files in a folder
141
+ \`\`\`
142
+ "sources": [
143
+ {
144
+ "input": ".knowhow/downloads/**/*.webm",
145
+ "output": ".knowhow/organized/",
146
+ "prompt": "FSOrganizer",
147
+ "agent": "Developer"
148
+ }
149
+ ],
150
+ \`\`\`
151
+
152
+ Prompt Example:
153
+
154
+ \`\`\`
155
+ We have this file, we want to generate a nice name for it, please copy the file to .knowhow/org/{better file name}
156
+
157
+ {text}
158
+ \`\`\`
159
+
160
+ ## knowhow generate: meeting transcripts
161
+ \`\`\`json
162
+ "sources": [
163
+ {
164
+ "input": "./meetings/**/*.mov",
165
+ "output": "./meetings/ai-notes/",
166
+ "prompt": "MeetingNotes"
167
+ },
168
+ {
169
+ "input": "./meetings/TaskRelatedCall/transcript.txt",
170
+ "output": "./meetings/tasks/RewardsTasks.txt",
171
+ "prompt": "AsanaTasks"
172
+ },
173
+ {
174
+ "input": "./meetings/EngineeringCall/transcript.txt",
175
+ "output": "./meetings/tasks/SchemaChanges.txt",
176
+ "prompt": "Schema"
177
+ }
178
+ ],
179
+ \`\`\`
180
+
181
+
182
+ Use the source block alongside \`knowhow generate\` to process a pipeline of files, applying prompts to generate documentation or other artifacts. This example demonstrates the configuration for processing meeting recordings, and then running prompts on the resulting transcripts.
183
+
184
+ I've been using \`CMD+SHIFT+5\` to record meetings and then using the \`sources\` block to process the recordings into notes and tasks.
185
+
186
+ When a .mov or audio file is an input, it will automatically create a transcript.txt in the same directory, so we can leverage that txt input in the next step. The pipeline is useful for apply one or more prompts to one or more input files.
187
+
188
+ ## knowhow embed: documentation embeddings
189
+ \`\`\`json
190
+ "embedSources": [
191
+ {
192
+ "input": "./documentation/docusaurus/docs/dev-docs/**/*.md",
193
+ "output": ".knowhow/embeddings/strapi-docs.json",
194
+ "chunkSize": 2000
195
+ }
196
+ ]
197
+ \`\`\`
198
+
199
+ ## knowhow embed: codebase embeddings
200
+ \`\`\`json
201
+
202
+ "embedSources": [
203
+ {
204
+ "input": "./packages/p2p/src/**/*.ts",
205
+ "output": ".knowhow/embeddings/p2p.json",
206
+ "chunkSize": 2000
207
+ },
208
+ {
209
+ "input": "./packages/openai_proxy/src/**/*.ts",
210
+ "output": ".knowhow/embeddings/openai_proxy.json",
211
+ "chunkSize": 2000
212
+ },
213
+ {
214
+ "input": "./packages/contracts/src/**/*.sol",
215
+ "output": ".knowhow/embeddings/contracts.json",
216
+ "chunkSize": 2000
217
+ }
218
+ ],
219
+ \`\`\`
220
+ You can use \`knowhow embed\` to generate json embeddings from a set of files. If you want to run a prompt on the input, before embedding, you set an optional \`prompt\` field to match the filename of the prompt stored in your \`.knowhow/prompts\` directory.
221
+
222
+ These embeddings are leveraged by the chat in \`knowhow chat\` or by the agents to accomplish their tasks
223
+
224
+ ## knowhow embed: asana tasks
225
+ \`\`\`
226
+ "embedSources": [
227
+ {
228
+ "input": "https://app.asana.com/0/111111111111111/list",
229
+ "output": ".knowhow/embeddings/asana.json",
230
+ "remote": "mybucket",
231
+ "remoteType": "s3",
232
+ "kind": "asana",
233
+ "chunkSize": 2000
234
+ }
235
+ ],
236
+ \`\`\`
237
+
238
+
239
+ Any plugin that implements the embedding function, can generate embeddings if you set the \`kind\` field to the plugin name. The \`remote\` field is optional, and if set, the embeddings will be uploaded to the specified S3 bucket via \`knowhow upload\`.
240
+
241
+ You can download remote embeddings via \`knowhow download\` and use them in your local environment.
242
+
243
+ For downloads we support the following remote options:
244
+ - s3
245
+ - github* - downloads files
246
+
247
+ For uploads we support the following remote options:
248
+ - s3
249
+ - github* - use git lfs to commit the embeddings to your repository
250
+
251
+
252
+ ## knowhow embed: github embeddings
253
+ \`\`\`
254
+ "embedSources": [
255
+ {
256
+ "input": "./src/**/*.ts",
257
+ "output": ".knowhow/embeddings/knowhow.json",
258
+ "chunkSize": 2000,
259
+ "remote": "micahriggan/knowhow",
260
+ "remoteType": "github"
261
+ }
262
+ ],
263
+ \`\`\`
264
+ Here's an example where you could download embeddings from github. As the code updates occasionally I'll run \`knowhow embed\` and commit the updated embeddings.
265
+
266
+ ## Plugins
267
+ \`\`\`json
268
+ {
269
+ "plugins": [
270
+ "embeddings",
271
+ "language",
272
+ "vim",
273
+ "github",
274
+ "asana",
275
+ "jira",
276
+ "linear",
277
+ "download",
278
+ "figma",
279
+ "notion"
280
+ ],
281
+ }
282
+ \`\`\`
283
+ Plugins are used to resolve urls or other references to data that the AI can use. For example, the \`asana\` plugin can be used to resolve tasks and projects from Asana, and the \`figma\` plugin can be used to resolve design files from Figma.
284
+
285
+ The language plugin allows you to define hotkeys that resolve to larger blocks of texts or files, or urls. For example, you can define a language entry \`#asana\` that resolves to a link to your current asana task, so that you can easily load that without pasting the link each time.
286
+
287
+
288
+ ## knowhow chat:
289
+ After generating embeddings, you can use \`knowhow chat\` to speak with a base agent, that does not have any tools, but does have plugins.
290
+
291
+ You can use \`agent\` once you're in a chat to start talking to a Developer agent, that has a prompt and tools designed to help develop software.
292
+ You can use \`agents\` to see a list of configured agents you can speak with.
293
+ If you need multi-line input you can use \`multi\` to open a multi-line editor.
294
+
295
+ There are many commands you can call from a chat session, try TAB to see a list of available options.
296
+
297
+
298
+ ### knowhow chat: custom agents
299
+ \`\`\`json
300
+ "assistants": [
301
+ {
302
+ "name": "linter",
303
+ "description": "Clean up your code",
304
+ "instructions": "Read the files that are loaded via vim plugin and provide debugging and linter suggestions"
305
+ }
306
+ ]
307
+ \`\`\`
308
+ You can configure new agents via the config above. This would create a new option when you use \`agents\` in a chat session.
309
+
310
+ ## Lint Commands
311
+
312
+ \`\`\`json
313
+ {
314
+ "lintCommands": {
315
+ "js": "eslint",
316
+ "ts": "tslint $1 && tsc -p tsconfig.json"
317
+ }
318
+ }
319
+ \`\`\`
320
+ lintCommands are automatically run after an agent successfully patches a file, if the file extension matches. So you can configure the AI to receive feedback from tsc and the linter after modifying a TypeScript file. $1 will be replaced with the filepath that was patched.
321
+
322
+
323
+
324
+ ## Language Plugin
325
+
326
+ Configured in \`.knowhow/language.json\`
327
+
328
+ Knowhow has a language file, which allows you to define additional context that is included when you use certain phrases in your messages. For instance, you could load a Pull Request when you say "My PR", or load a file from the codebase when you reference it. Languages have "terms" which then load various sources into context. Sources currently can be files, text, or github links.
329
+
330
+ I primarily use this to define terms like "frontend" or "backend" to load prompt files
331
+
332
+ ## Example Language Definition
333
+
334
+ \`\`\`
335
+ {
336
+ "ui,frontend,component,page": {
337
+ "sources": [
338
+ {
339
+ "data": [
340
+ "./.knowhow/prompts/frontend.mdx"
341
+ ],
342
+ "kind": "file"
343
+ }
344
+ ]
345
+ }
346
+ }
347
+ \`\`\`
348
+
349
+
350
+ Here's and example of having a language term that triggers a plugin.
351
+ This example would load the diff of a PR every time we said "my pr"
352
+ \`\`\`
353
+ {
354
+ "knowhow config": {
355
+ "sources": [
356
+ {
357
+ "kind": "file",
358
+ "data": [
359
+ ".knowhow/knowhow.json"
360
+ ]
361
+ }
362
+ ]
363
+ },
364
+ "My PR": {
365
+ "sources": [
366
+ {
367
+ "kind": "github",
368
+ "data": [
369
+ "https://github.com/tyvm-ai/knowhow/pulls/1"
370
+ ]
371
+ }
372
+ ]
373
+ }
374
+ }
375
+ \`\`\`
376
+ `
@@ -1,5 +1,6 @@
1
1
  import axios from "axios";
2
2
  import fs from "fs";
3
+ import { Message } from "../clients/types";
3
4
  import path from "path";
4
5
  import {
5
6
  CompletionOptions,
@@ -9,6 +10,29 @@ import {
9
10
  } from "src/clients";
10
11
  import { Config } from "../types";
11
12
 
13
+ // Chat Task interfaces
14
+ export interface CreateMessageTaskRequest {
15
+ messageId: string;
16
+ prompt: string;
17
+ }
18
+
19
+ export interface CreateMessageTaskResponse {
20
+ id: string;
21
+ }
22
+
23
+ export interface UpdateOrgTaskRequest {
24
+ threads: Message[][];
25
+ totalCostUsd: number;
26
+ inProgress: boolean;
27
+ result?: string;
28
+ }
29
+
30
+ export interface UpdateOrgTaskResponse {
31
+ threadCount: Message[][];
32
+ totalCostUsd: number;
33
+ inProgress: boolean;
34
+ }
35
+
12
36
  export function loadKnowhowJwt(): string {
13
37
  const jwtFile = path.join(process.cwd(), ".knowhow", ".jwt");
14
38
  if (!fs.existsSync(jwtFile)) {
@@ -17,6 +41,9 @@ export function loadKnowhowJwt(): string {
17
41
  return fs.readFileSync(jwtFile, "utf-8").trim();
18
42
  }
19
43
 
44
+ export const KNOWHOW_API_URL =
45
+ process.env.KNOWHOW_API_URL || "https://api.knowhow.tyvm.ai";
46
+
20
47
  export class KnowhowSimpleClient {
21
48
  headers = {};
22
49
 
@@ -72,8 +99,6 @@ export class KnowhowSimpleClient {
72
99
  }
73
100
  );
74
101
 
75
- console.log(presignedUrlResp.data);
76
-
77
102
  const presignedUrl = presignedUrlResp.data.downloadUrl;
78
103
  return presignedUrl;
79
104
  }
@@ -106,5 +131,26 @@ export class KnowhowSimpleClient {
106
131
  headers: this.headers,
107
132
  });
108
133
  }
109
- }
110
134
 
135
+ createChatTask(request: CreateMessageTaskRequest) {
136
+ this.checkJwt();
137
+ return axios.post<CreateMessageTaskResponse>(
138
+ `${this.baseUrl}/api/chat/tasks`,
139
+ request,
140
+ {
141
+ headers: this.headers,
142
+ }
143
+ );
144
+ }
145
+
146
+ updateChatTask(taskId: string, updates: UpdateOrgTaskRequest) {
147
+ this.checkJwt();
148
+ return axios.put<UpdateOrgTaskResponse>(
149
+ `${this.baseUrl}/api/chat/tasks/${taskId}`,
150
+ updates,
151
+ {
152
+ headers: this.headers,
153
+ }
154
+ );
155
+ }
156
+ }
@@ -32,6 +32,13 @@ export const knowhowConfig = {
32
32
  export * from "./McpServer";
33
33
  export * from "./McpWebsocketTransport";
34
34
 
35
+ /*
36
+ *
37
+ * McpService is a service that manages connections to multiple MCP servers.
38
+ * Allows us to connect the tools exposed by MCP servers to our internal ToolService, which agents can use.
39
+ * Each of the tools are namespaced with a prefix: mcp_index_servername_toolName
40
+ * This services handles calls made to the namespaced function name, and finds the proper client to call the tool on.
41
+ */
35
42
  export class McpService {
36
43
  connected = [];
37
44
  transports: Transport[] = [];
@@ -133,11 +140,11 @@ export class McpService {
133
140
  await Promise.all(
134
141
  this.transports.map(async (transport, index) => {
135
142
  this.connected[index] = false;
136
- return transport.close();
143
+ return transport && transport.close();
137
144
  })
138
145
  );
139
146
 
140
- this.transports = [];
147
+ // this.transports = [];
141
148
  this.connected = [];
142
149
  }
143
150
 
@@ -207,7 +214,7 @@ export class McpService {
207
214
 
208
215
  const realName = this.parseToolName(toolName);
209
216
  return async (args: any) => {
210
- console.log("Calling tool", realName, "with args", args);
217
+ console.log("Calling tool via mcp client", realName, "with args", args);
211
218
  const tool = await client.callTool(
212
219
  {
213
220
  name: realName,
@@ -223,6 +230,38 @@ export class McpService {
223
230
  };
224
231
  }
225
232
 
233
+ /**
234
+ * Call a function and unwrap the MCP response content array with type casting
235
+ * @param toolName The name of the tool/function to call
236
+ * @param args The arguments to pass to the function
237
+ * @returns The parsed result with type T
238
+ */
239
+ async callFunction<T = any>(toolName: string, args: any = {}): Promise<T> {
240
+ try {
241
+ const fn = this.getFunction(toolName);
242
+ const result = await fn(args);
243
+
244
+ // Parse the MCP result
245
+ if (result.content && Array.isArray(result.content)) {
246
+ const textContent = result.content.find((c: any) => c.type === "text");
247
+ if (textContent && textContent.text) {
248
+ const parsedResult = JSON.parse(textContent.text);
249
+ return parsedResult as T;
250
+ }
251
+ }
252
+
253
+ throw new Error(
254
+ `Invalid response format from MCP service for tool ${toolName}`
255
+ );
256
+ } catch (error) {
257
+ const errorMessage =
258
+ error instanceof Error ? error.message : String(error);
259
+ throw new Error(
260
+ `Failed to call MCP function ${toolName}: ${errorMessage}`
261
+ );
262
+ }
263
+ }
264
+
226
265
  async getFunctions() {
227
266
  const tools = await this.getTools();
228
267
  return tools.map((tool) => {
@@ -25,7 +25,10 @@ export class McpServerService {
25
25
  return this;
26
26
  }
27
27
 
28
- toZodSchema(properties: { [key: string]: ToolProp }): z.ZodObject<any> {
28
+ toZodSchema(
29
+ properties: { [key: string]: ToolProp },
30
+ required?: string[]
31
+ ): z.ZodObject<any> {
29
32
  const schema: Record<string, z.ZodTypeAny> = {};
30
33
  for (const [key, value] of Object.entries(properties)) {
31
34
  if (value.type === "string") {
@@ -35,19 +38,26 @@ export class McpServerService {
35
38
  } else if (value.type === "boolean") {
36
39
  schema[key] = z.boolean();
37
40
  } else if (value.type === "array" && value?.items?.properties) {
38
- schema[key] = z.array(this.toZodSchema(value.items.properties));
41
+ schema[key] = z.array(this.toZodSchema(value.items.properties, required));
39
42
  } else if (value.type === "object" && value.properties) {
40
- schema[key] = this.toZodSchema(value.properties);
43
+ schema[key] = this.toZodSchema(value.properties, required);
41
44
  } else {
42
45
  schema[key] = z.any();
43
46
  }
47
+
48
+ // Make field optional if it's not in the required array
49
+ if (required && !required.includes(key)) {
50
+ schema[key] = schema[key].optional();
51
+ }
44
52
  }
53
+
45
54
  return z.object(schema);
46
55
  }
47
56
 
48
57
  withTools(tools: Tool[]) {
49
58
  for (const tool of tools) {
50
59
  const props = tool.function.parameters.properties;
60
+ const required = tool.function.parameters.required;
51
61
 
52
62
  if (!props) {
53
63
  console.warn(`Tool ${tool.function.name} has no properties`);
@@ -62,7 +72,7 @@ export class McpServerService {
62
72
  console.log(`Registering tool ${tool.function.name}`);
63
73
  this.registeredTools.add(tool.function.name);
64
74
 
65
- const shape = this.toZodSchema(props).shape;
75
+ const shape = this.toZodSchema(props, required).shape;
66
76
 
67
77
  this.server.tool(
68
78
  tool.function.name,
@@ -48,13 +48,27 @@ export class MCPWebSocketTransport implements Transport {
48
48
  return new Promise((resolve, reject) => {
49
49
  const json = JSON.stringify(message);
50
50
  console.log("MCPWs sending", json);
51
- this._socket.send(json, (error?: Error) => {
52
- if (error) {
53
- this.onerror?.(error);
54
- return reject(error);
55
- }
56
- resolve();
57
- });
51
+
52
+ if (this._socket.readyState !== WebSocket.OPEN) {
53
+ return reject(
54
+ new Error(
55
+ `WebSocket is not open: readyState ${this._socket.readyState}`
56
+ )
57
+ );
58
+ }
59
+
60
+ try {
61
+ this._socket.send(json, (error?: Error) => {
62
+ if (error) {
63
+ this.onerror?.(error);
64
+ return reject(error);
65
+ }
66
+ resolve();
67
+ });
68
+ } catch (error) {
69
+ this.onerror?.(error as Error);
70
+ reject(error);
71
+ }
58
72
  });
59
73
  }
60
74
 
@@ -1,6 +1,11 @@
1
1
  import { Message } from "../clients/types";
2
2
 
3
- export type ProcessorLifecycle = "initial_call" | "per_call" | "post_call";
3
+ export type ProcessorLifecycle =
4
+ | "initial_call"
5
+ | "pre_call"
6
+ | "post_call"
7
+ | "pre_tools"
8
+ | "post_tools";
4
9
 
5
10
  export type MessageProcessorFunction = (
6
11
  originalMessages: Message[],
@@ -18,9 +23,7 @@ export class MessageProcessor {
18
23
 
19
24
  constructor() {
20
25
  // Initialize lifecycle maps
21
- this.processors.set("initial_call", []);
22
- this.processors.set("per_call", []);
23
- this.processors.set("post_call", []);
26
+ this.clearProcessors();
24
27
  }
25
28
 
26
29
  setProcessors(
@@ -100,8 +103,10 @@ export class MessageProcessor {
100
103
  } else {
101
104
  this.processors.clear();
102
105
  this.processors.set("initial_call", []);
103
- this.processors.set("per_call", []);
106
+ this.processors.set("pre_call", []);
104
107
  this.processors.set("post_call", []);
108
+ this.processors.set("pre_tools", []);
109
+ this.processors.set("post_tools", []);
105
110
  }
106
111
  }
107
112
  }
@@ -1,3 +1,5 @@
1
+ import { openai } from "../ai";
2
+ import { DownloaderService } from "../plugins/downloader/downloader";
1
3
  import { Clients } from "../clients";
2
4
  import { Plugins } from "../plugins/plugins";
3
5
  import { AgentService } from "./AgentService";
@@ -31,6 +33,7 @@ let Singletons = {} as {
31
33
  knowhowApiClient: KnowhowSimpleClient;
32
34
  Plugins: typeof Plugins;
33
35
  Clients: typeof Clients;
36
+ Downloader: DownloaderService;
34
37
  };
35
38
 
36
39
  export const services = (): typeof Singletons => {
@@ -38,10 +41,12 @@ export const services = (): typeof Singletons => {
38
41
  const Tools = new ToolsService();
39
42
  const Events = new EventService();
40
43
  const Agents = new AgentService(Tools, Events);
44
+ const Downloader = new DownloaderService(openai, Clients);
41
45
  Singletons = {
42
46
  Tools,
43
47
  Events,
44
48
  Agents,
49
+ Downloader,
45
50
 
46
51
  Flags: new FlagsService(),
47
52
  GitHub: new GitHubService(),