@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
@@ -2,8 +2,6 @@ import { Tool } from "../../clients/types";
2
2
  import { ChatCompletionTool } from "openai/resources/chat";
3
3
 
4
4
  import { services } from "../../services";
5
- import * as github from "./github/definitions";
6
- import * as asana from "./asana/definitions";
7
5
  import * as ycmd from "./ycmd/definitions";
8
6
  import * as language from "./language/definitions";
9
7
  import * as mcp from "./mcp/definitions";
@@ -710,152 +708,7 @@ export const includedTools = [
710
708
  executeScriptDefinition,
711
709
  googleSearchDefinition,
712
710
  startAgentTaskDefinition,
713
- {
714
- type: "function",
715
- function: {
716
- name: "astListPaths",
717
- description:
718
- "List all available simple paths in a file using tree-sitter AST parsing. Useful for understanding the structure of a file before making targeted edits.",
719
- parameters: {
720
- type: "object",
721
- positional: true,
722
- properties: {
723
- filePath: {
724
- type: "string",
725
- description: "The path to the file to analyze",
726
- },
727
- },
728
- required: ["filePath"],
729
- },
730
- returns: {
731
- type: "string",
732
- description:
733
- "JSON object containing all available AST paths in the file",
734
- },
735
- },
736
- },
737
- {
738
- type: "function",
739
- function: {
740
- name: "astEditNode",
741
- description:
742
- "Update a node at a specific AST path in a file using tree-sitter parsing. Use astListPaths first to find available paths.",
743
- parameters: {
744
- type: "object",
745
- positional: true,
746
- properties: {
747
- filePath: {
748
- type: "string",
749
- description: "The path to the file to edit",
750
- },
751
- path: {
752
- type: "string",
753
- description:
754
- "The AST path to the node to update (from astListPaths)",
755
- },
756
- newContent: {
757
- type: "string",
758
- description: "The new content to replace the node with",
759
- },
760
- },
761
- required: ["filePath", "path", "newContent"],
762
- },
763
- returns: {
764
- type: "string",
765
- description: "JSON object with edit result and updated file content",
766
- },
767
- },
768
- },
769
- {
770
- type: "function",
771
- function: {
772
- name: "astAppendNode",
773
- description:
774
- "Append a child node to a specific AST path in a file using tree-sitter parsing. Use astListPaths first to find available paths.",
775
- parameters: {
776
- type: "object",
777
- positional: true,
778
- properties: {
779
- filePath: {
780
- type: "string",
781
- description: "The path to the file to edit",
782
- },
783
- parentPath: {
784
- type: "string",
785
- description: "The AST path to the parent node (from astListPaths)",
786
- },
787
- newContent: {
788
- type: "string",
789
- description: "The content of the child node to append",
790
- },
791
- },
792
- required: ["filePath", "parentPath", "newContent"],
793
- },
794
- returns: {
795
- type: "string",
796
- description: "JSON object with append result and updated file content",
797
- },
798
- },
799
- },
800
- {
801
- type: "function",
802
- function: {
803
- name: "astDeleteNode",
804
- description:
805
- "Delete a node at a specific AST path in a file using tree-sitter parsing. Use astListPaths first to find available paths.",
806
- parameters: {
807
- type: "object",
808
- positional: true,
809
- properties: {
810
- filePath: {
811
- type: "string",
812
- description: "The path to the file to edit",
813
- },
814
- path: {
815
- type: "string",
816
- description:
817
- "The AST path to the node to delete (from astListPaths)",
818
- },
819
- },
820
- required: ["filePath", "path"],
821
- },
822
- returns: {
823
- type: "string",
824
- description: "JSON object with delete result and updated file content",
825
- },
826
- },
827
- },
828
- {
829
- type: "function",
830
- function: {
831
- name: "astGetPathForLine",
832
- description:
833
- "Get the AST path for a specific line of text in a file using tree-sitter parsing. Useful for finding the structural location of specific code.",
834
- parameters: {
835
- type: "object",
836
- positional: true,
837
- properties: {
838
- filePath: {
839
- type: "string",
840
- description: "The path to the file to analyze",
841
- },
842
- searchText: {
843
- type: "string",
844
- description: "The text to search for in the file",
845
- },
846
- },
847
- required: ["filePath", "searchText"],
848
- },
849
- returns: {
850
- type: "string",
851
- description:
852
- "JSON object containing AST paths and locations for the matching text",
853
- },
854
- },
855
- },
856
- ...asana.definitions,
857
711
  ...ycmd.definitions,
858
- ...github.definitions,
859
712
  ...language.definitions,
860
713
  ...mcp.definitions,
861
714
  ] as Tool[];
@@ -1,6 +1,3 @@
1
- import { chromium } from "playwright-extra";
2
- import stealth from "puppeteer-extra-plugin-stealth";
3
-
4
1
  export interface LoadWebpageOptions {
5
2
  url: string;
6
3
  mode?: "text" | "screenshot";
@@ -14,116 +11,9 @@ export async function loadWebpage(
14
11
  waitForSelector?: string,
15
12
  timeout: number = 30000
16
13
  ): Promise<string> {
17
- let browser;
18
- let page;
19
-
20
- try {
21
- console.log(`Loading webpage: ${url} in ${mode} mode`);
22
-
23
- chromium.use(stealth());
24
-
25
- // Launch browser with stealth settings
26
- browser = await chromium.launch({
27
- headless: true,
28
- args: [
29
- "--disable-setuid-sandbox",
30
- "--disable-dev-shm-usage",
31
- "--disable-accelerated-2d-canvas",
32
- "--no-first-run",
33
- "--no-zygote",
34
- "--disable-gpu",
35
- "--disable-blink-features=AutomationControlled",
36
- process.env.DISABLE_CHROME_SANDBOX === "true" ? "--no-sandbox" : "",
37
- ],
38
- });
39
-
40
- const context = await browser.newContext({
41
- userAgent:
42
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
43
- viewport: { width: 1366, height: 768 },
44
- extraHTTPHeaders: {
45
- "Accept-Language": "en-US,en;q=0.9",
46
- },
47
- });
48
-
49
- page = await context.newPage();
50
-
51
- // Capture console logs for text mode
52
- const consoleLogs: string[] = [];
53
- if (mode === "text") {
54
- page.on("console", (msg) => {
55
- consoleLogs.push(`[${msg.type()}] ${msg.text()}`);
56
- });
57
- }
58
-
59
- // Navigate to the URL
60
- await page.goto(url, {
61
- waitUntil: "networkidle",
62
- timeout,
63
- });
64
-
65
- // Wait for specific selector if provided
66
- if (waitForSelector) {
67
- await page.waitForSelector(waitForSelector, { timeout });
68
- }
69
-
70
- let result: string;
71
-
72
- if (mode === "screenshot") {
73
- // Take screenshot and return base64 encoded image
74
- const screenshot = await page.screenshot({
75
- fullPage: true,
76
- type: "png",
77
- });
78
-
79
- const base64Screenshot = screenshot.toString("base64");
80
- result = `data:image/png;base64,${base64Screenshot}`;
81
- } else {
82
- // Extract text content
83
- const textContent = await page.evaluate(() => {
84
- // Remove script and style elements
85
- const scripts = document.querySelectorAll("script, style");
86
- scripts.forEach((el) => el.remove());
87
-
88
- // Get the text content
89
- return document.body?.innerText || document.body?.textContent || "";
90
- });
91
-
92
- // Get page title
93
- const title = await page.title();
94
-
95
- // Format the result
96
- result = `# ${title}\n\n## Page Content:\n${textContent}`;
97
-
98
- if (consoleLogs.length > 0) {
99
- result += `\n\n## Console Logs:\n${consoleLogs.join("\n")}`;
100
- }
101
- }
102
-
103
- return result;
104
- } catch (error) {
105
- console.error("Error loading webpage:", error);
106
- return `Error loading webpage: ${
107
- error instanceof Error ? error.message : String(error)
108
- }`;
109
- } finally {
110
- // Always close the browser
111
- if (page) {
112
- try {
113
- await page.close();
114
- } catch (e) {
115
- console.warn("Error closing page:", e);
116
- }
117
- }
118
-
119
- if (browser) {
120
- try {
121
- await browser.close();
122
- } catch (e) {
123
- console.warn("Error closing browser:", e);
124
- }
125
- }
126
- }
14
+ throw new Error(
15
+ "loadWebpage requires @tyvm/knowhow-module-load-webpage to be installed and configured in knowhow.json modules."
16
+ );
127
17
  }
128
18
 
129
19
  export default loadWebpage;
package/src/ai.ts CHANGED
@@ -6,6 +6,7 @@ import { Assistant } from "./types";
6
6
  import { convertToText } from "./conversion";
7
7
  import { getConfigSync } from "./config";
8
8
  import { Clients } from "./clients";
9
+ import { getModelContextLimit } from "./clients/contextLimits";
9
10
 
10
11
  const config = getConfigSync();
11
12
  const OPENAI_KEY = process.env.OPENAI_KEY;
@@ -59,7 +60,7 @@ export async function singlePrompt(userPrompt: string, model = "", agent = "") {
59
60
  }
60
61
 
61
62
  if (!model) {
62
- model = Models.openai.GPT_4o;
63
+ model = Models.openai.GPT_54_Nano;
63
64
  }
64
65
 
65
66
  // Assume we're using provider/model format of model
@@ -71,12 +72,43 @@ export async function singlePrompt(userPrompt: string, model = "", agent = "") {
71
72
  return resp?.choices?.[0]?.message?.content;
72
73
  }
73
74
 
75
+ /**
76
+ * Rough token estimate: ~4 characters per token (common heuristic).
77
+ */
78
+ function estimateTokens(text: string): number {
79
+ return Math.ceil(text.length / 4);
80
+ }
81
+
74
82
  export async function summarizeTexts(
75
83
  texts: string[],
76
84
  template: string,
77
85
  model = "",
78
86
  agent = ""
79
87
  ) {
88
+ const effectiveModel = model || Models.openai.GPT_54_Nano;
89
+
90
+ // Estimate total tokens if we were to combine all texts into one prompt
91
+ const combinedText = texts.join("\n\n");
92
+ const combinedContent = template.replaceAll("{text}", combinedText);
93
+ const estimatedTokens = estimateTokens(combinedContent);
94
+ const contextLimit = getModelContextLimit(effectiveModel);
95
+
96
+ console.log(
97
+ `summarizeTexts: ${texts.length} text(s), ~${estimatedTokens} estimated tokens, context limit: ${contextLimit}`
98
+ );
99
+
100
+ // If everything fits in one context window, do a single prompt
101
+ if (estimatedTokens < contextLimit) {
102
+ console.log("summarizeTexts: fits in context window, using single prompt");
103
+ return singlePrompt(combinedContent, model, agent).catch((err) => {
104
+ return `Texts of combined length ${combinedText.length} could not be summarized due to error: ${err.message}`;
105
+ });
106
+ }
107
+
108
+ // Otherwise summarize each text individually, then combine
109
+ console.log(
110
+ "summarizeTexts: exceeds context window, summarizing texts individually"
111
+ );
80
112
  const summaries = [];
81
113
  for (const text of texts) {
82
114
  const content = template.replaceAll("{text}", text);
@@ -94,7 +126,6 @@ export async function summarizeTexts(
94
126
  }
95
127
 
96
128
  // Otherwise form a final summary of the pieces
97
-
98
129
  const finalPrompt =
99
130
  `Generate a final output for this prompt ${template} with these incremental summaries: ` +
100
131
  summaries.join("\n\n");
@@ -1,4 +1,4 @@
1
- import axios from "axios";
1
+ import http from "../utils/http";
2
2
  import { exec } from "child_process";
3
3
  import { promisify } from "util";
4
4
  import * as os from "os";
@@ -81,7 +81,7 @@ export class BrowserLoginService {
81
81
  );
82
82
  }
83
83
 
84
- const statusResponse = await axios.get(
84
+ const statusResponse = await http.get(
85
85
  `${this.baseUrl}/api/cli-login/session/${sessionData.sessionId}/status`,
86
86
  { timeout: 10000 }
87
87
  );
@@ -93,7 +93,7 @@ export class BrowserLoginService {
93
93
  spinner.start("Authentication successful! Retrieving token");
94
94
 
95
95
  // Step 4: Retrieve JWT token
96
- const tokenResponse = await axios.post(
96
+ const tokenResponse = await http.post(
97
97
  `${this.baseUrl}/api/cli-login/session/${sessionData.sessionId}/token`
98
98
  );
99
99
 
@@ -113,7 +113,7 @@ export class BrowserLoginService {
113
113
  );
114
114
  }
115
115
  } catch (error) {
116
- if (axios.isAxiosError(error) && error.code !== "ECONNABORTED") {
116
+ if (http.isHttpError(error) && error.status !== 408) {
117
117
  throw new BrowserLoginError(
118
118
  `Network error: ${error.message}`,
119
119
  "NETWORK_ERROR"
@@ -139,23 +139,20 @@ export class BrowserLoginService {
139
139
  */
140
140
  private async createSession(): Promise<CreateSessionResponse> {
141
141
  try {
142
- const response = await axios.post<CreateSessionResponse>(
142
+ const response = await http.post<CreateSessionResponse>(
143
143
  `${this.baseUrl}/api/cli-login/session`,
144
- {},
145
- { timeout: 10000 }
144
+ {}
146
145
  );
147
146
  return response.data;
148
147
  } catch (error) {
149
- if (axios.isAxiosError(error)) {
148
+ if (http.isHttpError(error)) {
150
149
  throw new BrowserLoginError(
151
- `Failed to create login session: ${
152
- error.response?.data?.message || error.message
153
- }`,
150
+ `Failed to create login session: ${error.message}`,
154
151
  "SESSION_CREATE_FAILED"
155
152
  );
156
153
  }
157
154
  throw new BrowserLoginError(
158
- `Unexpected error creating session: ${error.message}`
155
+ `Unexpected error creating session: ${(error as Error).message}`
159
156
  );
160
157
  }
161
158
  }
@@ -226,7 +223,7 @@ export async function openBrowser(url: string): Promise<void> {
226
223
  } catch (error) {
227
224
  // If we can't open the browser automatically, that's not a fatal error
228
225
  // The user can still manually navigate to the URL
229
- console.warn(`Could not automatically open browser: ${error.message}`);
226
+ console.warn(`Could not automatically open browser: ${(error as Error).message}`);
230
227
  }
231
228
  }
232
229
 
package/src/cli.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node --no-node-snapshot
2
- import "source-map-support/register";
3
2
  import * as fs from "fs";
4
3
  import * as fsPromises from "fs/promises";
5
4
  import * as path from "path";
@@ -26,7 +25,6 @@ import {
26
25
  } from "./workerRegistry";
27
26
  import { agents } from "./agents";
28
27
  import { startChat } from "./chat";
29
- import { askAI } from "./chat-old";
30
28
  import { getConfiguredEmbeddingMap, queryEmbedding } from "./embeddings";
31
29
  import { getConfig } from "./config";
32
30
  import { getEnabledPlugins } from "./types";
@@ -42,7 +40,7 @@ import { CliChatService } from "./chat/CliChatService";
42
40
 
43
41
  async function setupServices() {
44
42
  const { Agents, Mcp, Clients, Tools: OldTools } = services();
45
- const Tools = new LazyToolsService();
43
+ const Tools = new LazyToolsService(); // eslint-disable-line no-shadow
46
44
 
47
45
  // We need to wireup the LazyTools to be connected to the same singletons that are in services()
48
46
  Tools.setContext({
@@ -80,6 +78,9 @@ async function setupServices() {
80
78
  console.log("Connecting to clients...");
81
79
  await Clients.registerConfiguredModels();
82
80
  console.log("✓ Services are set up and ready to go!");
81
+
82
+ // Return both LazyToolsService (for agents) and OldTools (plain ToolsService with all tools for scripts)
83
+ return { Tools, Clients, PlainTools: OldTools };
83
84
  }
84
85
 
85
86
  // Utility function to read from stdin
@@ -488,6 +489,65 @@ async function main() {
488
489
  }
489
490
  });
490
491
 
492
+ program
493
+ .command("script")
494
+ .description("Run a local tool script file using the executeScript sandbox")
495
+ .option("--input-file <path>", "Path to a local .js/.ts script file to run")
496
+ .option(
497
+ "--allow-network",
498
+ "Allow fetch() calls in the script (disabled by default for security)"
499
+ )
500
+ .action(async (options) => {
501
+ try {
502
+ if (!options.inputFile) {
503
+ console.error(
504
+ "Error: Provide --input-file <path> to the script file to run"
505
+ );
506
+ process.exit(1);
507
+ }
508
+
509
+ // Run a local script file
510
+ const scriptPath = path.resolve(options.inputFile);
511
+ if (!fs.existsSync(scriptPath)) {
512
+ console.error(`Error: Script file not found: ${scriptPath}`);
513
+ process.exit(1);
514
+ }
515
+ const scriptContent = fs.readFileSync(scriptPath, "utf-8");
516
+
517
+ const { Tools, Clients } = await setupServices();
518
+
519
+ // Enable all tools on the LazyToolsService so scripts can access MCP tools
520
+ // (LazyToolsService starts with only meta-tools enabled; we need all for scripts)
521
+ Tools.enableTools(["*"]);
522
+
523
+ const { ScriptExecutor } = await import(
524
+ "./services/script-execution/ScriptExecutor"
525
+ );
526
+ const executor = new ScriptExecutor(Tools, Clients);
527
+ const result = await executor.execute({
528
+ script: scriptContent,
529
+ policy: {
530
+ allowNetworkAccess: !!options.allowNetwork,
531
+ },
532
+ quotas: {
533
+ maxExecutionTimeMs: 5 * 60 * 1000, // 5 minutes for CLI scripts
534
+ },
535
+ });
536
+
537
+ if (result.consoleOutput?.length) {
538
+ console.log(result.consoleOutput.join("\n"));
539
+ }
540
+ console.log(JSON.stringify(result.result, null, 2));
541
+ if (!result.success) {
542
+ console.error("Script error:", result.error);
543
+ process.exit(1);
544
+ }
545
+ } catch (error) {
546
+ console.error("Error running script:", error);
547
+ process.exit(1);
548
+ }
549
+ });
550
+
491
551
  program
492
552
  .command("github-credentials [action]")
493
553
  .description(