@tyvm/knowhow 0.0.89 → 0.0.91

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 (344) hide show
  1. package/.depcheckrc +31 -0
  2. package/CONFIG.md +52 -0
  3. package/README.md +344 -29
  4. package/WORKER.md +169 -334
  5. package/autodoc/chat-guide.md +540 -0
  6. package/autodoc/cli-reference.md +765 -0
  7. package/autodoc/config-reference.md +541 -0
  8. package/autodoc/embeddings-guide.md +566 -0
  9. package/autodoc/generate-guide.md +477 -0
  10. package/autodoc/language-plugin-guide.md +443 -0
  11. package/autodoc/modules-guide.md +352 -0
  12. package/autodoc/plugins-guide.md +720 -0
  13. package/autodoc/quickstart-guide.md +129 -0
  14. package/autodoc/skills-guide.md +468 -0
  15. package/autodoc/worker-guide.md +526 -0
  16. package/bin/knowhow.js +1 -1
  17. package/package.json +4 -32
  18. package/src/agents/tools/executeScript/index.ts +5 -0
  19. package/src/agents/tools/googleSearch.ts +2 -2
  20. package/src/agents/tools/index.ts +0 -3
  21. package/src/agents/tools/list.ts +0 -147
  22. package/src/agents/tools/loadWebpage.ts +3 -113
  23. package/src/ai.ts +33 -2
  24. package/src/auth/browserLogin.ts +10 -13
  25. package/src/cli.ts +63 -3
  26. package/src/clients/gemini.ts +96 -25
  27. package/src/clients/http.ts +7 -11
  28. package/src/clients/pricing/google.ts +122 -26
  29. package/src/config.ts +28 -4
  30. package/src/conversion.ts +24 -54
  31. package/src/index.ts +30 -3
  32. package/src/login.ts +5 -6
  33. package/src/plugins/language.ts +0 -4
  34. package/src/plugins/plugins.ts +0 -14
  35. package/src/plugins/url.ts +31 -12
  36. package/src/processors/TokenCompressor.ts +2 -2
  37. package/src/processors/ToolResponseCache.ts +3 -3
  38. package/src/processors/tools/grepToolResponse.ts +9 -4
  39. package/src/processors/tools/jqToolResponse.ts +11 -6
  40. package/src/processors/tools/listStoredToolResponses.ts +1 -1
  41. package/src/processors/tools/tailToolResponse.ts +9 -4
  42. package/src/services/GitHub.ts +2 -2
  43. package/src/services/KnowhowClient.ts +34 -34
  44. package/src/{plugins/downloader/downloader.ts → services/MediaProcessorService.ts} +109 -267
  45. package/src/services/S3.ts +16 -16
  46. package/src/services/index.ts +4 -4
  47. package/src/services/modules/index.ts +10 -2
  48. package/src/services/modules/types.ts +5 -2
  49. package/src/services/script-execution/ScriptExecutor.ts +29 -10
  50. package/src/services/script-execution/ScriptPolicy.ts +6 -2
  51. package/src/types.ts +1 -0
  52. package/src/utils/http.ts +127 -0
  53. package/src/workers/auth/PasskeySetup.ts +7 -11
  54. package/tests/clients/AIClient.test.ts +24 -21
  55. package/tests/manual/file-edits/figma.test.ts +3 -70
  56. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +2 -0
  57. package/tests/plugins/language/languagePlugin.test.ts +2 -0
  58. package/tests/processors/ToolResponseCache.test.ts +2 -2
  59. package/tests/test.spec.ts +0 -14
  60. package/tests/unit/modules/moduleLoading.test.ts +7 -4
  61. package/tests/unit/plugins/pluginLoading.test.ts +6 -6
  62. package/ts_build/package.json +4 -32
  63. package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -1
  64. package/ts_build/src/agents/tools/ast/astAppendNode.js +2 -90
  65. package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -1
  66. package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -1
  67. package/ts_build/src/agents/tools/ast/astDeleteNode.js +2 -88
  68. package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -1
  69. package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -1
  70. package/ts_build/src/agents/tools/ast/astEditNode.js +2 -90
  71. package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -1
  72. package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -1
  73. package/ts_build/src/agents/tools/ast/astGetPathForLine.js +2 -72
  74. package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -1
  75. package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -1
  76. package/ts_build/src/agents/tools/ast/astListPaths.js +2 -72
  77. package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -1
  78. package/ts_build/src/agents/tools/executeScript/index.d.ts +3 -2
  79. package/ts_build/src/agents/tools/executeScript/index.js +4 -1
  80. package/ts_build/src/agents/tools/executeScript/index.js.map +1 -1
  81. package/ts_build/src/agents/tools/googleSearch.js +2 -2
  82. package/ts_build/src/agents/tools/googleSearch.js.map +1 -1
  83. package/ts_build/src/agents/tools/index.d.ts +0 -3
  84. package/ts_build/src/agents/tools/index.js +0 -3
  85. package/ts_build/src/agents/tools/index.js.map +1 -1
  86. package/ts_build/src/agents/tools/list.js +0 -138
  87. package/ts_build/src/agents/tools/list.js.map +1 -1
  88. package/ts_build/src/agents/tools/loadWebpage.js +1 -89
  89. package/ts_build/src/agents/tools/loadWebpage.js.map +1 -1
  90. package/ts_build/src/agents/tools/textSearch.d.ts +1 -1
  91. package/ts_build/src/ai.js +18 -1
  92. package/ts_build/src/ai.js.map +1 -1
  93. package/ts_build/src/auth/browserLogin.js +7 -7
  94. package/ts_build/src/auth/browserLogin.js.map +1 -1
  95. package/ts_build/src/cli.d.ts +1 -1
  96. package/ts_build/src/cli.js +47 -1
  97. package/ts_build/src/cli.js.map +1 -1
  98. package/ts_build/src/clients/gemini.d.ts +1 -73
  99. package/ts_build/src/clients/gemini.js +57 -19
  100. package/ts_build/src/clients/gemini.js.map +1 -1
  101. package/ts_build/src/clients/http.js +5 -9
  102. package/ts_build/src/clients/http.js.map +1 -1
  103. package/ts_build/src/clients/pricing/google.d.ts +17 -73
  104. package/ts_build/src/clients/pricing/google.js +47 -10
  105. package/ts_build/src/clients/pricing/google.js.map +1 -1
  106. package/ts_build/src/config.js +17 -2
  107. package/ts_build/src/config.js.map +1 -1
  108. package/ts_build/src/conversion.d.ts +1 -4
  109. package/ts_build/src/conversion.js +12 -27
  110. package/ts_build/src/conversion.js.map +1 -1
  111. package/ts_build/src/index.d.ts +4 -0
  112. package/ts_build/src/index.js +19 -3
  113. package/ts_build/src/index.js.map +1 -1
  114. package/ts_build/src/login.js +5 -4
  115. package/ts_build/src/login.js.map +1 -1
  116. package/ts_build/src/plugins/downloader/downloader.js +3 -3
  117. package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
  118. package/ts_build/src/plugins/language.js.map +1 -1
  119. package/ts_build/src/plugins/plugins.js +0 -14
  120. package/ts_build/src/plugins/plugins.js.map +1 -1
  121. package/ts_build/src/plugins/tree-sitter/editor.d.ts +3 -32
  122. package/ts_build/src/plugins/tree-sitter/editor.js +6 -208
  123. package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -1
  124. package/ts_build/src/plugins/tree-sitter/parser.d.ts +19 -54
  125. package/ts_build/src/plugins/tree-sitter/parser.js +19 -293
  126. package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -1
  127. package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +2 -15
  128. package/ts_build/src/plugins/tree-sitter/simple-paths.js +2 -324
  129. package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -1
  130. package/ts_build/src/plugins/url.js +27 -8
  131. package/ts_build/src/plugins/url.js.map +1 -1
  132. package/ts_build/src/processors/TokenCompressor.js +2 -2
  133. package/ts_build/src/processors/TokenCompressor.js.map +1 -1
  134. package/ts_build/src/processors/ToolResponseCache.js +3 -3
  135. package/ts_build/src/processors/ToolResponseCache.js.map +1 -1
  136. package/ts_build/src/processors/tools/grepToolResponse.d.ts +3 -1
  137. package/ts_build/src/processors/tools/grepToolResponse.js +8 -2
  138. package/ts_build/src/processors/tools/grepToolResponse.js.map +1 -1
  139. package/ts_build/src/processors/tools/jqToolResponse.d.ts +3 -1
  140. package/ts_build/src/processors/tools/jqToolResponse.js +10 -4
  141. package/ts_build/src/processors/tools/jqToolResponse.js.map +1 -1
  142. package/ts_build/src/processors/tools/listStoredToolResponses.js +1 -1
  143. package/ts_build/src/processors/tools/listStoredToolResponses.js.map +1 -1
  144. package/ts_build/src/processors/tools/tailToolResponse.d.ts +3 -1
  145. package/ts_build/src/processors/tools/tailToolResponse.js +8 -2
  146. package/ts_build/src/processors/tools/tailToolResponse.js.map +1 -1
  147. package/ts_build/src/services/GitHub.js +2 -2
  148. package/ts_build/src/services/GitHub.js.map +1 -1
  149. package/ts_build/src/services/KnowhowClient.d.ts +29 -29
  150. package/ts_build/src/services/KnowhowClient.js +33 -33
  151. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  152. package/ts_build/src/services/MediaProcessorService.d.ts +22 -0
  153. package/ts_build/src/services/MediaProcessorService.js +215 -0
  154. package/ts_build/src/services/MediaProcessorService.js.map +1 -0
  155. package/ts_build/src/services/S3.js +12 -18
  156. package/ts_build/src/services/S3.js.map +1 -1
  157. package/ts_build/src/services/index.d.ts +3 -2
  158. package/ts_build/src/services/index.js +3 -3
  159. package/ts_build/src/services/index.js.map +1 -1
  160. package/ts_build/src/services/modules/index.js +10 -2
  161. package/ts_build/src/services/modules/index.js.map +1 -1
  162. package/ts_build/src/services/modules/types.d.ts +5 -2
  163. package/ts_build/src/services/script-execution/ScriptExecutor.js +22 -7
  164. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
  165. package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +1 -1
  166. package/ts_build/src/services/script-execution/ScriptPolicy.js +4 -2
  167. package/ts_build/src/services/script-execution/ScriptPolicy.js.map +1 -1
  168. package/ts_build/src/types.d.ts +1 -0
  169. package/ts_build/src/types.js +1 -0
  170. package/ts_build/src/types.js.map +1 -1
  171. package/ts_build/src/utils/http.d.ts +27 -0
  172. package/ts_build/src/utils/http.js +98 -0
  173. package/ts_build/src/utils/http.js.map +1 -0
  174. package/ts_build/src/workers/auth/PasskeySetup.js +6 -7
  175. package/ts_build/src/workers/auth/PasskeySetup.js.map +1 -1
  176. package/ts_build/tests/clients/AIClient.test.js +11 -14
  177. package/ts_build/tests/clients/AIClient.test.js.map +1 -1
  178. package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -1
  179. package/ts_build/tests/manual/file-edits/figma.test.js +1 -46
  180. package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -1
  181. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +2 -0
  182. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -1
  183. package/ts_build/tests/plugins/language/languagePlugin.test.js +2 -0
  184. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -1
  185. package/ts_build/tests/processors/ToolResponseCache.test.js +2 -2
  186. package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -1
  187. package/ts_build/tests/test.spec.js +0 -14
  188. package/ts_build/tests/test.spec.js.map +1 -1
  189. package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +0 -1
  190. package/ts_build/tests/tree-sitter/tree-sitter.test.js +2 -183
  191. package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -1
  192. package/ts_build/tests/unit/modules/moduleLoading.test.js +6 -4
  193. package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
  194. package/ts_build/tests/unit/plugins/pluginLoading.test.js +4 -4
  195. package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +1 -1
  196. package/autodoc/chat.mdx +0 -20
  197. package/autodoc/cli.mdx +0 -11
  198. package/autodoc/plugins/asana.mdx +0 -47
  199. package/autodoc/plugins/downloader/downloader.mdx +0 -38
  200. package/autodoc/plugins/downloader/plugin.mdx +0 -37
  201. package/autodoc/plugins/downloader/types.mdx +0 -42
  202. package/autodoc/plugins/embedding.mdx +0 -41
  203. package/autodoc/plugins/figma.mdx +0 -45
  204. package/autodoc/plugins/github.mdx +0 -40
  205. package/autodoc/plugins/jira.mdx +0 -46
  206. package/autodoc/plugins/language.mdx +0 -37
  207. package/autodoc/plugins/linear.mdx +0 -35
  208. package/autodoc/plugins/notion.mdx +0 -38
  209. package/autodoc/plugins/plugins.mdx +0 -59
  210. package/autodoc/plugins/types.mdx +0 -51
  211. package/autodoc/plugins/vim.mdx +0 -39
  212. package/autodoc/tools/addInternalTools.mdx +0 -1
  213. package/autodoc/tools/agentCall.mdx +0 -1
  214. package/autodoc/tools/asana/definitions.mdx +0 -10
  215. package/autodoc/tools/asana/index.mdx +0 -12
  216. package/autodoc/tools/askHuman.mdx +0 -1
  217. package/autodoc/tools/callPlugin.mdx +0 -1
  218. package/autodoc/tools/embeddingSearch.mdx +0 -1
  219. package/autodoc/tools/execCommand.mdx +0 -1
  220. package/autodoc/tools/fileSearch.mdx +0 -1
  221. package/autodoc/tools/finalAnswer.mdx +0 -1
  222. package/autodoc/tools/github/definitions.mdx +0 -6
  223. package/autodoc/tools/github/index.mdx +0 -8
  224. package/autodoc/tools/index.mdx +0 -14
  225. package/autodoc/tools/lintFile.mdx +0 -7
  226. package/autodoc/tools/list.mdx +0 -16
  227. package/autodoc/tools/modifyFile.mdx +0 -7
  228. package/autodoc/tools/patch.mdx +0 -9
  229. package/autodoc/tools/readBlocks.mdx +0 -1
  230. package/autodoc/tools/readFile.mdx +0 -1
  231. package/autodoc/tools/scanFile.mdx +0 -1
  232. package/autodoc/tools/textSearch.mdx +0 -6
  233. package/autodoc/tools/types/fileblock.mdx +0 -1
  234. package/autodoc/tools/visionTool.mdx +0 -1
  235. package/autodoc/tools/writeFile.mdx +0 -1
  236. package/benchmarks/.dockerignore +0 -7
  237. package/benchmarks/README.md +0 -166
  238. package/benchmarks/docker/Dockerfile +0 -68
  239. package/benchmarks/example-config.yml +0 -27
  240. package/benchmarks/jest.config.js +0 -13
  241. package/benchmarks/package-lock.json +0 -4297
  242. package/benchmarks/package.json +0 -39
  243. package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +0 -2909
  244. package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -1671
  245. package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +0 -2814
  246. package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -2014
  247. package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3121
  248. package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +0 -98
  249. package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +0 -3256
  250. package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +0 -4298
  251. package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3031
  252. package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -2990
  253. package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3256
  254. package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3007
  255. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -3256
  256. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +0 -3036
  257. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +0 -3280
  258. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -1920
  259. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +0 -3281
  260. package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +0 -2896
  261. package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3011
  262. package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +0 -3003
  263. package/benchmarks/scripts/build-and-run.sh +0 -47
  264. package/benchmarks/scripts/clone-exercism.sh +0 -92
  265. package/benchmarks/scripts/validate.sh +0 -48
  266. package/benchmarks/src/__tests__/runner.test.ts +0 -27
  267. package/benchmarks/src/cli.ts +0 -90
  268. package/benchmarks/src/evaluators/EvaluatorRegistry.ts +0 -64
  269. package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +0 -183
  270. package/benchmarks/src/evaluators/index.ts +0 -3
  271. package/benchmarks/src/evaluators/types.ts +0 -22
  272. package/benchmarks/src/index.ts +0 -3
  273. package/benchmarks/src/providers.ts +0 -13
  274. package/benchmarks/src/runner.ts +0 -824
  275. package/benchmarks/src/types.ts +0 -63
  276. package/benchmarks/tsconfig.json +0 -19
  277. package/leaderboard/README.md +0 -148
  278. package/leaderboard/app/api/benchmark-data/route.ts +0 -131
  279. package/leaderboard/app/api/benchmark-detail/route.ts +0 -172
  280. package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +0 -501
  281. package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +0 -375
  282. package/leaderboard/app/globals.css +0 -27
  283. package/leaderboard/app/layout.tsx +0 -21
  284. package/leaderboard/app/page.tsx +0 -170
  285. package/leaderboard/components/LeaderboardTable.tsx +0 -168
  286. package/leaderboard/components/PerformanceChart.tsx +0 -109
  287. package/leaderboard/next-env.d.ts +0 -5
  288. package/leaderboard/next.config.js +0 -4
  289. package/leaderboard/package-lock.json +0 -6363
  290. package/leaderboard/package.json +0 -28
  291. package/leaderboard/postcss.config.js +0 -6
  292. package/leaderboard/tailwind.config.js +0 -17
  293. package/leaderboard/tsconfig.json +0 -28
  294. package/leaderboard/types/benchmark.ts +0 -67
  295. package/leaderboard/utils/dataProcessor.ts +0 -33
  296. package/src/agents/tools/asana/definitions.ts +0 -199
  297. package/src/agents/tools/asana/index.ts +0 -108
  298. package/src/agents/tools/ast/astAppendNode.ts +0 -90
  299. package/src/agents/tools/ast/astDeleteNode.ts +0 -88
  300. package/src/agents/tools/ast/astEditNode.ts +0 -95
  301. package/src/agents/tools/ast/astGetPathForLine.ts +0 -73
  302. package/src/agents/tools/ast/astListPaths.ts +0 -66
  303. package/src/agents/tools/ast/index.ts +0 -7
  304. package/src/agents/tools/github/definitions.ts +0 -89
  305. package/src/agents/tools/github/index.ts +0 -67
  306. package/src/chat-old.ts +0 -446
  307. package/src/plugins/asana.ts +0 -146
  308. package/src/plugins/downloader/plugin.ts +0 -103
  309. package/src/plugins/downloader/types.ts +0 -92
  310. package/src/plugins/figma.ts +0 -158
  311. package/src/plugins/github.ts +0 -219
  312. package/src/plugins/jira.ts +0 -115
  313. package/src/plugins/linear.ts +0 -230
  314. package/src/plugins/notion.ts +0 -179
  315. package/src/plugins/tree-sitter/editor.ts +0 -369
  316. package/src/plugins/tree-sitter/lang-packs/index.ts +0 -23
  317. package/src/plugins/tree-sitter/lang-packs/java.ts +0 -59
  318. package/src/plugins/tree-sitter/lang-packs/javascript.ts +0 -57
  319. package/src/plugins/tree-sitter/lang-packs/python.ts +0 -45
  320. package/src/plugins/tree-sitter/lang-packs/types.ts +0 -79
  321. package/src/plugins/tree-sitter/lang-packs/typescript.ts +0 -49
  322. package/src/plugins/tree-sitter/parser.ts +0 -470
  323. package/src/plugins/tree-sitter/simple-paths.ts +0 -467
  324. package/test-comprehensive.ts +0 -31
  325. package/tests/tree-sitter/editor.test.ts +0 -113
  326. package/tests/tree-sitter/invalid.test.ts +0 -299
  327. package/tests/tree-sitter/paths/common-edits.test.ts +0 -564
  328. package/tests/tree-sitter/paths/debug-exact-position.test.ts +0 -44
  329. package/tests/tree-sitter/paths/debug-line-indexing.test.ts +0 -49
  330. package/tests/tree-sitter/paths/debug-paths.test.ts +0 -90
  331. package/tests/tree-sitter/paths/paths.test.ts +0 -170
  332. package/tests/tree-sitter/paths/simple-paths.test.ts +0 -367
  333. package/tests/tree-sitter/sample-after.ts +0 -48
  334. package/tests/tree-sitter/sample-before.ts +0 -25
  335. package/tests/tree-sitter/test-files/completely-broken.ts +0 -7
  336. package/tests/tree-sitter/test-files/duplicate-braces.ts +0 -39
  337. package/tests/tree-sitter/test-files/invalid-nesting.ts +0 -39
  338. package/tests/tree-sitter/test-files/malformed-signature.ts +0 -39
  339. package/tests/tree-sitter/test-files/mismatched-parens.ts +0 -39
  340. package/tests/tree-sitter/test-files/missing-semicolon.ts +0 -39
  341. package/tests/tree-sitter/test-files/partially-broken.ts +0 -20
  342. package/tests/tree-sitter/test-files/specific-errors.ts +0 -14
  343. package/tests/tree-sitter/test-files/unclosed-string.ts +0 -39
  344. package/tests/tree-sitter/tree-sitter.test.ts +0 -251
package/src/index.ts CHANGED
@@ -5,7 +5,6 @@ import {
5
5
  getHashes,
6
6
  checkNoFilesChanged,
7
7
  } from "./hashes";
8
- import axios from "axios";
9
8
  import * as fs from "fs";
10
9
  import * as path from "path";
11
10
  import * as crypto from "crypto";
@@ -52,6 +51,14 @@ export * as types from "./types";
52
51
  export * as processors from "./processors";
53
52
  export * as ai from "./ai";
54
53
 
54
+ // Export module system types for external modules
55
+ export * from "./services/modules/types";
56
+ // Export plugin types for external plugins
57
+ export { PluginBase } from "./plugins/PluginBase";
58
+ export { PluginMeta, Plugin, PluginContext } from "./plugins/types";
59
+ // Export embedding types
60
+ export { MinimalEmbedding, Embeddable } from "./types";
61
+
55
62
  export async function embed() {
56
63
  // load config
57
64
  const config = await getConfig();
@@ -154,12 +161,32 @@ export async function upload() {
154
161
  }
155
162
  }
156
163
 
164
+ /**
165
+ * Normalizes an input pattern to a valid glob pattern.
166
+ * Supports:
167
+ * - Standard glob patterns (e.g. "src/**\/*.ts")
168
+ * - Brace expansion (e.g. "{src/a.ts,src/b.ts}")
169
+ * - Comma-separated file paths (e.g. "src/a.ts,src/b.ts") — auto-converted to brace expansion
170
+ */
171
+ function normalizeInputPattern(input: string): string {
172
+ // If it already has braces or glob chars other than comma, use as-is
173
+ if (input.includes("{") || input.includes("*") || input.includes("?")) {
174
+ return input;
175
+ }
176
+ // If it contains commas, treat as comma-separated list and wrap in braces
177
+ if (input.includes(",")) {
178
+ const parts = input.split(",").map((p) => p.trim());
179
+ return `{${parts.join(",")}}`;
180
+ }
181
+ return input;
182
+ }
183
+
157
184
  export async function generate(): Promise<void> {
158
185
  const config = await getConfig();
159
186
  for (const source of config.sources) {
160
187
  console.log("Generating", source.input, "to", source.output);
161
188
  if (source.kind === "file" || !source.kind) {
162
- const files = globSync(source.input);
189
+ const files = globSync(normalizeInputPattern(source.input));
163
190
  const prompt = await loadPrompt(source.prompt);
164
191
 
165
192
  if (source.output.endsWith("/")) {
@@ -205,7 +232,7 @@ async function handleAllKindsGeneration(source: GenerationSource) {
205
232
 
206
233
  async function handleFileKindGeneration(source: GenerationSource) {
207
234
  const prompt = await loadPrompt(source.prompt);
208
- const files = globSync(source.input);
235
+ const files = globSync(normalizeInputPattern(source.input));
209
236
  console.log("Analyzing files: ", files);
210
237
 
211
238
  if (source.output.endsWith("/")) {
package/src/login.ts CHANGED
@@ -1,4 +1,4 @@
1
- import axios from "axios";
1
+ import http from "./utils/http";
2
2
  import fs from "fs";
3
3
  import path from "path";
4
4
  import { chmod } from "fs/promises";
@@ -68,11 +68,10 @@ export async function login(jwtFlag?: boolean): Promise<void> {
68
68
  await updateConfig(config);
69
69
  }
70
70
  } catch (error) {
71
- if (axios.isAxiosError(error) && error.response) {
71
+ if (http.isHttpError(error) && error.response) {
72
+ const errData = await error.response.json().catch(() => ({ message: "Unknown error" }));
72
73
  throw new Error(
73
- `Error: ${error.response.status} - ${
74
- error.response.data.message || "Unknown error"
75
- }`
74
+ `Error: ${error.status} - ${errData.message || "Unknown error"}`
76
75
  );
77
76
  }
78
77
  console.log(
@@ -98,7 +97,7 @@ export async function loadJwt(): Promise<string> {
98
97
  }
99
98
 
100
99
  export async function checkJwt(storedJwt: string) {
101
- const response = await axios.get(`${KNOWHOW_API_URL}/api/users/me`, {
100
+ const response = await http.get(`${KNOWHOW_API_URL}/api/users/me`, {
102
101
  headers: {
103
102
  Authorization: `Bearer ${storedJwt}`,
104
103
  },
@@ -6,10 +6,6 @@ import { getConfig, getLanguageConfig } from "../config";
6
6
  import { getEnabledPlugins } from "../types";
7
7
  import { PluginBase, PluginMeta } from "./PluginBase";
8
8
  import { Plugin, PluginContext } from "./types";
9
- import { GitHubPlugin } from "./github";
10
- import { AsanaPlugin } from "./asana";
11
- import { JiraPlugin } from "./jira";
12
- import { LinearPlugin } from "./linear";
13
9
  import { PluginService } from "./plugins";
14
10
 
15
11
  /**
@@ -4,13 +4,6 @@ import { VimPlugin } from "./vim";
4
4
  import { LinterPlugin } from "./LinterPlugin";
5
5
  import { LanguagePlugin } from "./language";
6
6
  import { EmbeddingPlugin } from "./embedding";
7
- import { GitHubPlugin } from "./github";
8
- import { AsanaPlugin } from "./asana";
9
- import { LinearPlugin } from "./linear";
10
- import { JiraPlugin } from "./jira";
11
- import { NotionPlugin } from "./notion";
12
- import { DownloaderPlugin } from "./downloader/plugin";
13
- import { FigmaPlugin } from "./figma";
14
7
  import { UrlPlugin } from "./url";
15
8
  import { GitPlugin } from "./GitPlugin";
16
9
  import { TmuxPlugin } from "./tmux";
@@ -33,13 +26,6 @@ export class PluginService {
33
26
  this.pluginMap.set("embeddings", new EmbeddingPlugin(context));
34
27
  this.pluginMap.set("vim", new VimPlugin(context));
35
28
  this.pluginMap.set("linter", new LinterPlugin(context));
36
- this.pluginMap.set("github", new GitHubPlugin(context));
37
- this.pluginMap.set("asana", new AsanaPlugin(context));
38
- this.pluginMap.set("linear", new LinearPlugin(context));
39
- this.pluginMap.set("jira", new JiraPlugin(context));
40
- this.pluginMap.set("notion", new NotionPlugin(context));
41
- this.pluginMap.set("download", new DownloaderPlugin(context));
42
- this.pluginMap.set("figma", new FigmaPlugin(context));
43
29
  this.pluginMap.set("language", new LanguagePlugin(context));
44
30
  this.pluginMap.set("url", new UrlPlugin(context));
45
31
  this.pluginMap.set("git", new GitPlugin(context));
@@ -1,9 +1,6 @@
1
1
  import { PluginBase, PluginMeta } from "./PluginBase";
2
2
  import { Plugin, PluginContext } from "./types";
3
3
  import { MinimalEmbedding } from "../types";
4
- import axios from "axios";
5
- import * as cheerio from "cheerio";
6
- import loadWebpage from "../agents/tools/loadWebpage";
7
4
 
8
5
  export class UrlPlugin extends PluginBase implements Plugin {
9
6
  static readonly meta: PluginMeta = {
@@ -20,22 +17,47 @@ export class UrlPlugin extends PluginBase implements Plugin {
20
17
 
21
18
  async embed(userPrompt: string): Promise<MinimalEmbedding[]> {
22
19
  const urls = this.extractUrls(userPrompt);
23
- const embeddings = await Promise.all(urls.map(this.fetchAndParseUrl));
20
+ const embeddings = await Promise.all(urls.map((url) => this.fetchAndParseUrl(url)));
24
21
  return embeddings.filter((e): e is MinimalEmbedding => e !== null);
25
22
  }
26
23
 
27
24
  extractUrls(userPrompt: string): string[] {
28
25
  const urlRegex = /(https?:\/\/[^\s]+)/g;
29
26
  const urls = userPrompt.match(urlRegex) || [];
30
-
31
27
  return Array.from(new Set(urls));
32
28
  }
33
29
 
34
30
  async fetchAndParseUrl(url: string): Promise<MinimalEmbedding | null> {
35
31
  try {
36
- const text = await loadWebpage(url);
32
+ const response = await fetch(url, {
33
+ headers: {
34
+ "User-Agent": "Mozilla/5.0 (compatible; KnowhowBot/1.0)",
35
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
36
+ },
37
+ });
38
+
39
+ if (!response.ok) {
40
+ this.log(`URL PLUGIN: Failed to fetch ${url}: ${response.status}`, "warn");
41
+ return null;
42
+ }
43
+
44
+ const contentType = response.headers.get("content-type") || "";
45
+ let text = "";
46
+
47
+ if (contentType.includes("text/html") || contentType.includes("text/plain")) {
48
+ const html = await response.text();
49
+ // Simple HTML to text: strip tags
50
+ text = html
51
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "")
52
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "")
53
+ .replace(/<[^>]+>/g, " ")
54
+ .replace(/\s+/g, " ")
55
+ .trim();
56
+ } else {
57
+ text = await response.text();
58
+ }
37
59
 
38
- this.log(`URL PLUGIN: Fetched content from ${url}: ${text}`);
60
+ this.log(`URL PLUGIN: Fetched content from ${url}: ${text.substring(0, 100)}`);
39
61
 
40
62
  return {
41
63
  id: url + "-url",
@@ -58,7 +80,7 @@ export class UrlPlugin extends PluginBase implements Plugin {
58
80
  return "URL PLUGIN: Too many URLs detected. Skipping like unintentional bulk browse.";
59
81
  }
60
82
 
61
- const results = await Promise.all(urls.map(this.fetchAndParseUrl));
83
+ const results = await Promise.all(urls.map((url) => this.fetchAndParseUrl(url)));
62
84
  const validResults = results.filter(
63
85
  (r): r is MinimalEmbedding => r !== null
64
86
  );
@@ -70,10 +92,7 @@ export class UrlPlugin extends PluginBase implements Plugin {
70
92
  const formattedResults = validResults
71
93
  .map(
72
94
  (result) =>
73
- `URL: ${result.metadata.url}\n\nContent:\n${result.text.substring(
74
- 0,
75
- 500
76
- )}...`
95
+ `URL: ${result.metadata.url}\n\nContent:\n${result.text.substring(0, 500)}...`
77
96
  )
78
97
  .join("\n\n---\n\n");
79
98
 
@@ -131,7 +131,7 @@ export class TokenCompressor implements JsonCompressorStorage {
131
131
  200
132
132
  )}...\n[Use ${
133
133
  this.toolName
134
- } tool with key "${firstKey}" to retrieve content. Follow NEXT_CHUNK_KEY references for complete content]`;
134
+ } tool with key "${firstKey}" to retrieve content. Follow NEXT_CHUNK_KEY references for complete content]\n[TIP: If this is JSON data, prefer using the jqToolResponse tool with the toolCallId instead — it parses ._data automatically and lets you filter/search without repeated expandTokens calls]`;
135
135
  }
136
136
 
137
137
  /**
@@ -413,7 +413,7 @@ export const expandTokensDefinition: Tool = {
413
413
  function: {
414
414
  name: "expandTokens",
415
415
  description:
416
- "Retrieve a chunk of compressed data that was stored during message processing. The returned content may contain a `NEXT_CHUNK_KEY` to retrieve subsequent chunks.",
416
+ "Retrieve a chunk of compressed data that was stored during message processing. The returned content may contain a `NEXT_CHUNK_KEY` to retrieve subsequent chunks. NOTE: If the compressed data is JSON (e.g. a tool response), prefer using jqToolResponse instead — it lets you query the data directly using JQ without repeatedly calling expandTokens. Use expandTokens only for plain text/string data or when you need the raw content.",
417
417
  parameters: {
418
418
  type: "object",
419
419
  positional: true,
@@ -200,7 +200,7 @@ export class ToolResponseCache {
200
200
  ): Promise<string> {
201
201
  const data = this.storage[toolCallId];
202
202
  const availableIds = Object.keys(this.storage);
203
- return executeJqQuery(data, toolCallId, jqQuery, availableIds);
203
+ return executeJqQuery(data, toolCallId, jqQuery, availableIds, this.toolNameMap);
204
204
  }
205
205
 
206
206
  /**
@@ -213,7 +213,7 @@ export class ToolResponseCache {
213
213
  ): Promise<string> {
214
214
  const data = this.storage[toolCallId];
215
215
  const availableIds = Object.keys(this.storage);
216
- return executeGrep(data, toolCallId, pattern, availableIds, options);
216
+ return executeGrep(data, toolCallId, pattern, availableIds, options, this.toolNameMap);
217
217
  }
218
218
 
219
219
  /**
@@ -225,7 +225,7 @@ export class ToolResponseCache {
225
225
  ): Promise<string> {
226
226
  const data = this.storage[toolCallId];
227
227
  const availableIds = Object.keys(this.storage);
228
- return executeTail(data, toolCallId, availableIds, options);
228
+ return executeTail(data, toolCallId, availableIds, options, this.toolNameMap);
229
229
  }
230
230
 
231
231
  /**
@@ -16,12 +16,17 @@ export async function executeGrep(
16
16
  toolCallId: string,
17
17
  pattern: string,
18
18
  availableIds: string[],
19
- options?: GrepOptions
19
+ options?: GrepOptions,
20
+ toolNameMap?: { [toolCallId: string]: string }
20
21
  ): Promise<string> {
21
22
  if (!data) {
22
- return `Error: No tool response found for toolCallId "${toolCallId}". Available IDs: ${availableIds.join(
23
- ", "
24
- )}`;
23
+ const idList = availableIds
24
+ .map((id) => {
25
+ const name = toolNameMap?.[id];
26
+ return name ? `${id} (${name})` : id;
27
+ })
28
+ .join("\n - ");
29
+ return `Error: No tool response found for toolCallId "${toolCallId}". Call listStoredToolResponses to see all available responses with their tool names.\n\nAvailable toolCallIds:\n - ${idList || "(none)"}`;
25
30
  }
26
31
 
27
32
  try {
@@ -46,12 +46,17 @@ export async function executeJqQuery(
46
46
  data: string,
47
47
  toolCallId: string,
48
48
  jqQuery: string,
49
- availableIds: string[]
49
+ availableIds: string[],
50
+ toolNameMap?: { [toolCallId: string]: string }
50
51
  ): Promise<string> {
51
52
  if (!data) {
52
- return `Error: No tool response found for toolCallId "${toolCallId}". Available IDs: ${availableIds.join(
53
- ", "
54
- )}`;
53
+ const idList = availableIds
54
+ .map((id) => {
55
+ const name = toolNameMap?.[id];
56
+ return name ? `${id} (${name})` : id;
57
+ })
58
+ .join("\n - ");
59
+ return `Error: No tool response found for toolCallId "${toolCallId}". Call listStoredToolResponses to see all available responses with their tool names.\n\nAvailable toolCallIds:\n - ${idList || "(none)"}`;
55
60
  }
56
61
 
57
62
  try {
@@ -103,7 +108,7 @@ export const jqToolResponseDefinition: Tool = {
103
108
  function: {
104
109
  name: "jqToolResponse",
105
110
  description:
106
- "Execute a JQ query on a stored tool response to extract specific data. Use this when you need to extract specific information from any tool response that has been stored. Many MCP tool responses store data in nested structures like .content[0].text where the actual data array is located.",
111
+ "Execute a JQ query on a stored tool response to extract specific data. Use this when you need to extract specific information from any tool response that has been stored. This is the preferred way to search or filter compressed JSON tool responses it parses the data automatically without requiring repeated expandTokens calls. IMPORTANT: You do NOT know the toolCallId at the time you call a tool — you must call listStoredToolResponses first to discover the correct toolCallId. The listStoredToolResponses output shows each response's tool name so you can identify which response belongs to which call. How to determine the correct JQ query: (1) For mcp_* tool responses (external MCP tools like mcp_1_*): the response is stored as a raw JSON object — use '.' to access the root directly, e.g. '.children | map(.name)' or '.state'. Do NOT use .content[0].text | fromjson for these. (2) For compressed MCP tool responses (._mcp_format === true): use '._data' e.g. '._data.children | map(.name)'. (3) For standard built-in tool responses: data may be nested under '.content[0].text | fromjson'. Use jqToolResponse instead of expandTokens whenever the stored data is JSON.",
107
112
  parameters: {
108
113
  type: "object",
109
114
  positional: true,
@@ -115,7 +120,7 @@ export const jqToolResponseDefinition: Tool = {
115
120
  jqQuery: {
116
121
  type: "string",
117
122
  description:
118
- "The JQ query to execute on the tool response data. Examples: '.content[0].text | map(.title)' (extract titles from MCP array), '.content[0].text | map(select(.createdAt > \"2025-01-01\"))' (filter MCP items by date) ",
123
+ "The JQ query to execute on the tool response data. For mcp_* tool responses (raw JSON object): '.children | map({id: .id, name: .name})' (extract fields from children array), '.children | map(select(.state == \"PENDING\")) | length' (count pending children), '.name' (get a top-level field). For compressed responses (._mcp_format true): '._data.children | map(.name)' or '._data | map(select(.state == \"PENDING\")) | length'. For standard built-in tool responses: '.content[0].text | fromjson | map(.title)' (extract titles from standard MCP array), '.content[0].text | fromjson | map(select(.createdAt > \"2025-01-01\"))' (filter by date).",
119
124
  },
120
125
  },
121
126
  required: ["toolCallId", "jqQuery"],
@@ -72,7 +72,7 @@ export const listStoredToolResponsesDefinition: Tool = {
72
72
  function: {
73
73
  name: "listStoredToolResponses",
74
74
  description:
75
- "List all stored tool responses with metadata including tool call ID, tool name, size, timestamp, and a preview of the content. Use this to discover which tool responses are available for querying with jqToolResponse or grepToolResponse.",
75
+ "List all stored tool responses with metadata including tool call ID, tool name, size, timestamp, and a preview of the content. ALWAYS call this before using jqToolResponse, grepToolResponse, or tailToolResponse — you need the toolCallId from this list to query a specific response. The tool name shown here corresponds to the tool that produced the response (e.g. 'mcp_1_knowhow-web_GetOrgUserTask'), making it easy to identify which response you want.",
76
76
  parameters: {
77
77
  type: "object",
78
78
  positional: false,
@@ -11,12 +11,17 @@ export async function executeTail(
11
11
  data: string,
12
12
  toolCallId: string,
13
13
  availableIds: string[],
14
- options?: TailOptions
14
+ options?: TailOptions,
15
+ toolNameMap?: { [toolCallId: string]: string }
15
16
  ): Promise<string> {
16
17
  if (data === null || data === undefined) {
17
- return `Error: No tool response found for toolCallId "${toolCallId}". Available IDs: ${availableIds.join(
18
- ", "
19
- )}`;
18
+ const idList = availableIds
19
+ .map((id) => {
20
+ const name = toolNameMap?.[id];
21
+ return name ? `${id} (${name})` : id;
22
+ })
23
+ .join("\n - ");
24
+ return `Error: No tool response found for toolCallId "${toolCallId}". Call listStoredToolResponses to see all available responses with their tool names.\n\nAvailable toolCallIds:\n - ${idList || "(none)"}`;
20
25
  }
21
26
 
22
27
  try {
@@ -1,5 +1,5 @@
1
1
  import { Octokit } from "@octokit/rest";
2
- import axios from "axios";
2
+ import http from "../utils/http";
3
3
 
4
4
  export class GitHubService {
5
5
  octokit: Octokit;
@@ -22,7 +22,7 @@ export class GitHubService {
22
22
  }
23
23
 
24
24
  private async getLfsContent(downloadUrl: string): Promise<string> {
25
- const response = await axios.get(downloadUrl);
25
+ const response = await http.get(downloadUrl);
26
26
  return JSON.stringify(response.data);
27
27
  }
28
28