@tyvm/knowhow 0.0.90 → 0.0.92

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 (272) hide show
  1. package/.depcheckrc +30 -0
  2. package/bin/knowhow.js +1 -1
  3. package/package.json +8 -34
  4. package/src/agents/configurable/ConfigAgent.ts +2 -2
  5. package/src/agents/tools/executeScript/index.ts +5 -0
  6. package/src/agents/tools/googleSearch.ts +2 -2
  7. package/src/agents/tools/index.ts +0 -3
  8. package/src/agents/tools/list.ts +0 -147
  9. package/src/agents/tools/loadWebpage.ts +3 -113
  10. package/src/auth/browserLogin.ts +10 -13
  11. package/src/chat/modules/AgentModule.ts +0 -1
  12. package/src/chat/types.ts +1 -1
  13. package/src/cli.ts +63 -3
  14. package/src/clients/gemini.ts +96 -25
  15. package/src/clients/http.ts +7 -11
  16. package/src/clients/pricing/google.ts +122 -26
  17. package/src/conversion.ts +24 -54
  18. package/src/index.ts +15 -20
  19. package/src/login.ts +5 -6
  20. package/src/plugins/language.ts +0 -4
  21. package/src/plugins/plugins.ts +0 -14
  22. package/src/plugins/url.ts +31 -12
  23. package/src/services/EmbeddingsService.ts +70 -0
  24. package/src/services/KnowhowClient.ts +34 -34
  25. package/src/{plugins/downloader/downloader.ts → services/MediaProcessorService.ts} +109 -267
  26. package/src/services/S3.ts +19 -87
  27. package/src/services/index.ts +8 -8
  28. package/src/services/modules/index.ts +12 -3
  29. package/src/services/modules/types.ts +8 -2
  30. package/src/services/script-execution/ScriptExecutor.ts +29 -10
  31. package/src/services/script-execution/ScriptPolicy.ts +6 -2
  32. package/src/types.ts +1 -0
  33. package/src/utils/http.ts +127 -0
  34. package/src/workers/auth/PasskeySetup.ts +7 -11
  35. package/tests/clients/AIClient.test.ts +24 -21
  36. package/tests/manual/file-edits/figma.test.ts +3 -70
  37. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +2 -0
  38. package/tests/plugins/language/languagePlugin.test.ts +2 -0
  39. package/tests/processors/ToolResponseCache.test.ts +2 -2
  40. package/tests/test.spec.ts +0 -14
  41. package/tests/unit/modules/moduleLoading.test.ts +12 -4
  42. package/tests/unit/plugins/pluginLoading.test.ts +6 -6
  43. package/ts_build/package.json +8 -34
  44. package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -1
  45. package/ts_build/src/agents/tools/ast/astAppendNode.js +2 -90
  46. package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -1
  47. package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -1
  48. package/ts_build/src/agents/tools/ast/astDeleteNode.js +2 -88
  49. package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -1
  50. package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -1
  51. package/ts_build/src/agents/tools/ast/astEditNode.js +2 -90
  52. package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -1
  53. package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -1
  54. package/ts_build/src/agents/tools/ast/astGetPathForLine.js +2 -72
  55. package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -1
  56. package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -1
  57. package/ts_build/src/agents/tools/ast/astListPaths.js +2 -72
  58. package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -1
  59. package/ts_build/src/agents/tools/executeScript/index.d.ts +3 -2
  60. package/ts_build/src/agents/tools/executeScript/index.js +4 -1
  61. package/ts_build/src/agents/tools/executeScript/index.js.map +1 -1
  62. package/ts_build/src/agents/tools/googleSearch.js +2 -2
  63. package/ts_build/src/agents/tools/googleSearch.js.map +1 -1
  64. package/ts_build/src/agents/tools/index.d.ts +0 -3
  65. package/ts_build/src/agents/tools/index.js +0 -3
  66. package/ts_build/src/agents/tools/index.js.map +1 -1
  67. package/ts_build/src/agents/tools/list.js +0 -138
  68. package/ts_build/src/agents/tools/list.js.map +1 -1
  69. package/ts_build/src/agents/tools/loadWebpage.js +1 -89
  70. package/ts_build/src/agents/tools/loadWebpage.js.map +1 -1
  71. package/ts_build/src/agents/tools/textSearch.d.ts +1 -1
  72. package/ts_build/src/auth/browserLogin.js +7 -7
  73. package/ts_build/src/auth/browserLogin.js.map +1 -1
  74. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  75. package/ts_build/src/chat/types.d.ts +1 -1
  76. package/ts_build/src/cli.d.ts +1 -1
  77. package/ts_build/src/cli.js +47 -1
  78. package/ts_build/src/cli.js.map +1 -1
  79. package/ts_build/src/clients/gemini.d.ts +1 -73
  80. package/ts_build/src/clients/gemini.js +57 -19
  81. package/ts_build/src/clients/gemini.js.map +1 -1
  82. package/ts_build/src/clients/http.js +5 -9
  83. package/ts_build/src/clients/http.js.map +1 -1
  84. package/ts_build/src/clients/pricing/google.d.ts +17 -73
  85. package/ts_build/src/clients/pricing/google.js +47 -10
  86. package/ts_build/src/clients/pricing/google.js.map +1 -1
  87. package/ts_build/src/conversion.d.ts +1 -4
  88. package/ts_build/src/conversion.js +12 -27
  89. package/ts_build/src/conversion.js.map +1 -1
  90. package/ts_build/src/index.d.ts +4 -0
  91. package/ts_build/src/index.js +15 -14
  92. package/ts_build/src/index.js.map +1 -1
  93. package/ts_build/src/login.js +5 -4
  94. package/ts_build/src/login.js.map +1 -1
  95. package/ts_build/src/plugins/downloader/downloader.js +3 -3
  96. package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
  97. package/ts_build/src/plugins/language.js.map +1 -1
  98. package/ts_build/src/plugins/plugins.js +0 -14
  99. package/ts_build/src/plugins/plugins.js.map +1 -1
  100. package/ts_build/src/plugins/tree-sitter/editor.d.ts +3 -32
  101. package/ts_build/src/plugins/tree-sitter/editor.js +6 -208
  102. package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -1
  103. package/ts_build/src/plugins/tree-sitter/parser.d.ts +19 -54
  104. package/ts_build/src/plugins/tree-sitter/parser.js +19 -293
  105. package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -1
  106. package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +2 -15
  107. package/ts_build/src/plugins/tree-sitter/simple-paths.js +2 -324
  108. package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -1
  109. package/ts_build/src/plugins/url.js +27 -8
  110. package/ts_build/src/plugins/url.js.map +1 -1
  111. package/ts_build/src/services/EmbeddingsService.d.ts +14 -0
  112. package/ts_build/src/services/EmbeddingsService.js +33 -0
  113. package/ts_build/src/services/EmbeddingsService.js.map +1 -0
  114. package/ts_build/src/services/GitHub.js +2 -2
  115. package/ts_build/src/services/GitHub.js.map +1 -1
  116. package/ts_build/src/services/KnowhowClient.d.ts +29 -29
  117. package/ts_build/src/services/KnowhowClient.js +33 -33
  118. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  119. package/ts_build/src/services/MediaProcessorService.d.ts +22 -0
  120. package/ts_build/src/services/MediaProcessorService.js +215 -0
  121. package/ts_build/src/services/MediaProcessorService.js.map +1 -0
  122. package/ts_build/src/services/S3.d.ts +0 -4
  123. package/ts_build/src/services/S3.js +14 -60
  124. package/ts_build/src/services/S3.js.map +1 -1
  125. package/ts_build/src/services/index.d.ts +6 -5
  126. package/ts_build/src/services/index.js +6 -6
  127. package/ts_build/src/services/index.js.map +1 -1
  128. package/ts_build/src/services/modules/index.js +12 -3
  129. package/ts_build/src/services/modules/index.js.map +1 -1
  130. package/ts_build/src/services/modules/types.d.ts +8 -2
  131. package/ts_build/src/services/script-execution/ScriptExecutor.js +22 -7
  132. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
  133. package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +1 -1
  134. package/ts_build/src/services/script-execution/ScriptPolicy.js +4 -2
  135. package/ts_build/src/services/script-execution/ScriptPolicy.js.map +1 -1
  136. package/ts_build/src/types.d.ts +1 -0
  137. package/ts_build/src/types.js +1 -0
  138. package/ts_build/src/types.js.map +1 -1
  139. package/ts_build/src/utils/http.d.ts +27 -0
  140. package/ts_build/src/utils/http.js +98 -0
  141. package/ts_build/src/utils/http.js.map +1 -0
  142. package/ts_build/src/workers/auth/PasskeySetup.js +6 -7
  143. package/ts_build/src/workers/auth/PasskeySetup.js.map +1 -1
  144. package/ts_build/tests/clients/AIClient.test.js +11 -14
  145. package/ts_build/tests/clients/AIClient.test.js.map +1 -1
  146. package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -1
  147. package/ts_build/tests/manual/file-edits/figma.test.js +1 -46
  148. package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -1
  149. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +2 -0
  150. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -1
  151. package/ts_build/tests/plugins/language/languagePlugin.test.js +2 -0
  152. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -1
  153. package/ts_build/tests/processors/ToolResponseCache.test.js +2 -2
  154. package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -1
  155. package/ts_build/tests/test.spec.js +0 -14
  156. package/ts_build/tests/test.spec.js.map +1 -1
  157. package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +0 -1
  158. package/ts_build/tests/tree-sitter/tree-sitter.test.js +2 -183
  159. package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -1
  160. package/ts_build/tests/unit/modules/moduleLoading.test.js +11 -4
  161. package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
  162. package/ts_build/tests/unit/plugins/pluginLoading.test.js +4 -4
  163. package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +1 -1
  164. package/benchmarks/.dockerignore +0 -7
  165. package/benchmarks/README.md +0 -166
  166. package/benchmarks/docker/Dockerfile +0 -68
  167. package/benchmarks/example-config.yml +0 -27
  168. package/benchmarks/jest.config.js +0 -13
  169. package/benchmarks/package-lock.json +0 -4297
  170. package/benchmarks/package.json +0 -39
  171. package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +0 -2909
  172. package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -1671
  173. package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +0 -2814
  174. package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -2014
  175. package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3121
  176. package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +0 -98
  177. package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +0 -3256
  178. package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +0 -4298
  179. package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3031
  180. package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -2990
  181. package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3256
  182. package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3007
  183. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -3256
  184. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +0 -3036
  185. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +0 -3280
  186. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -1920
  187. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +0 -3281
  188. package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +0 -2896
  189. package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3011
  190. package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +0 -3003
  191. package/benchmarks/scripts/build-and-run.sh +0 -47
  192. package/benchmarks/scripts/clone-exercism.sh +0 -92
  193. package/benchmarks/scripts/validate.sh +0 -48
  194. package/benchmarks/src/__tests__/runner.test.ts +0 -27
  195. package/benchmarks/src/cli.ts +0 -90
  196. package/benchmarks/src/evaluators/EvaluatorRegistry.ts +0 -64
  197. package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +0 -183
  198. package/benchmarks/src/evaluators/index.ts +0 -3
  199. package/benchmarks/src/evaluators/types.ts +0 -22
  200. package/benchmarks/src/index.ts +0 -3
  201. package/benchmarks/src/providers.ts +0 -13
  202. package/benchmarks/src/runner.ts +0 -824
  203. package/benchmarks/src/types.ts +0 -63
  204. package/benchmarks/tsconfig.json +0 -19
  205. package/leaderboard/README.md +0 -148
  206. package/leaderboard/app/api/benchmark-data/route.ts +0 -131
  207. package/leaderboard/app/api/benchmark-detail/route.ts +0 -172
  208. package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +0 -501
  209. package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +0 -375
  210. package/leaderboard/app/globals.css +0 -27
  211. package/leaderboard/app/layout.tsx +0 -21
  212. package/leaderboard/app/page.tsx +0 -170
  213. package/leaderboard/components/LeaderboardTable.tsx +0 -168
  214. package/leaderboard/components/PerformanceChart.tsx +0 -109
  215. package/leaderboard/next-env.d.ts +0 -5
  216. package/leaderboard/next.config.js +0 -4
  217. package/leaderboard/package-lock.json +0 -6363
  218. package/leaderboard/package.json +0 -28
  219. package/leaderboard/postcss.config.js +0 -6
  220. package/leaderboard/tailwind.config.js +0 -17
  221. package/leaderboard/tsconfig.json +0 -28
  222. package/leaderboard/types/benchmark.ts +0 -67
  223. package/leaderboard/utils/dataProcessor.ts +0 -33
  224. package/src/agents/tools/asana/definitions.ts +0 -199
  225. package/src/agents/tools/asana/index.ts +0 -108
  226. package/src/agents/tools/ast/astAppendNode.ts +0 -90
  227. package/src/agents/tools/ast/astDeleteNode.ts +0 -88
  228. package/src/agents/tools/ast/astEditNode.ts +0 -95
  229. package/src/agents/tools/ast/astGetPathForLine.ts +0 -73
  230. package/src/agents/tools/ast/astListPaths.ts +0 -66
  231. package/src/agents/tools/ast/index.ts +0 -7
  232. package/src/agents/tools/github/definitions.ts +0 -89
  233. package/src/agents/tools/github/index.ts +0 -67
  234. package/src/chat-old.ts +0 -446
  235. package/src/plugins/asana.ts +0 -146
  236. package/src/plugins/downloader/plugin.ts +0 -103
  237. package/src/plugins/downloader/types.ts +0 -92
  238. package/src/plugins/figma.ts +0 -158
  239. package/src/plugins/github.ts +0 -219
  240. package/src/plugins/jira.ts +0 -115
  241. package/src/plugins/linear.ts +0 -230
  242. package/src/plugins/notion.ts +0 -179
  243. package/src/plugins/tree-sitter/editor.ts +0 -369
  244. package/src/plugins/tree-sitter/lang-packs/index.ts +0 -23
  245. package/src/plugins/tree-sitter/lang-packs/java.ts +0 -59
  246. package/src/plugins/tree-sitter/lang-packs/javascript.ts +0 -57
  247. package/src/plugins/tree-sitter/lang-packs/python.ts +0 -45
  248. package/src/plugins/tree-sitter/lang-packs/types.ts +0 -79
  249. package/src/plugins/tree-sitter/lang-packs/typescript.ts +0 -49
  250. package/src/plugins/tree-sitter/parser.ts +0 -470
  251. package/src/plugins/tree-sitter/simple-paths.ts +0 -467
  252. package/src/services/GitHub.ts +0 -59
  253. package/tests/tree-sitter/editor.test.ts +0 -113
  254. package/tests/tree-sitter/invalid.test.ts +0 -299
  255. package/tests/tree-sitter/paths/common-edits.test.ts +0 -564
  256. package/tests/tree-sitter/paths/debug-exact-position.test.ts +0 -44
  257. package/tests/tree-sitter/paths/debug-line-indexing.test.ts +0 -49
  258. package/tests/tree-sitter/paths/debug-paths.test.ts +0 -90
  259. package/tests/tree-sitter/paths/paths.test.ts +0 -170
  260. package/tests/tree-sitter/paths/simple-paths.test.ts +0 -367
  261. package/tests/tree-sitter/sample-after.ts +0 -48
  262. package/tests/tree-sitter/sample-before.ts +0 -25
  263. package/tests/tree-sitter/test-files/completely-broken.ts +0 -7
  264. package/tests/tree-sitter/test-files/duplicate-braces.ts +0 -39
  265. package/tests/tree-sitter/test-files/invalid-nesting.ts +0 -39
  266. package/tests/tree-sitter/test-files/malformed-signature.ts +0 -39
  267. package/tests/tree-sitter/test-files/mismatched-parens.ts +0 -39
  268. package/tests/tree-sitter/test-files/missing-semicolon.ts +0 -39
  269. package/tests/tree-sitter/test-files/partially-broken.ts +0 -20
  270. package/tests/tree-sitter/test-files/specific-errors.ts +0 -14
  271. package/tests/tree-sitter/test-files/unclosed-string.ts +0 -39
  272. package/tests/tree-sitter/tree-sitter.test.ts +0 -251
package/.depcheckrc ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "ignores": [
3
+ "typescript",
4
+ "ts-jest",
5
+ "jest",
6
+ "ts-node",
7
+ "prettier",
8
+ "tslint",
9
+ "tslint-config-prettier",
10
+ "@types/jest",
11
+ "@types/node",
12
+ "@types/mocha",
13
+ "@types/diff",
14
+ "@types/express",
15
+ "@types/asana",
16
+ "@types/jira-client",
17
+ "@types/pdf-parse",
18
+ "@types/ws",
19
+ "@babel/preset-typescript"
20
+ ],
21
+ "ignore-patterns": [
22
+ "src/dataset/**",
23
+ "ts_build/**",
24
+ "node_modules/**",
25
+ "tests/**"
26
+ ],
27
+ "specials": [
28
+ "depcheck-special-bin"
29
+ ]
30
+ }
package/bin/knowhow.js CHANGED
@@ -10,7 +10,7 @@ if (!process.execArgv.includes("--no-node-snapshot")) {
10
10
 
11
11
  const result = spawnSync(
12
12
  process.execPath,
13
- ["--no-node-snapshot", cliEntrypoint, ...process.argv.slice(2)],
13
+ ["--no-node-snapshot", "--enable-source-maps", cliEntrypoint, ...process.argv.slice(2)],
14
14
  {
15
15
  stdio: "inherit",
16
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyvm/knowhow",
3
- "version": "0.0.90",
3
+ "version": "0.0.92",
4
4
  "description": "ai cli with plugins and agents",
5
5
  "main": "ts_build/src/index.js",
6
6
  "bin": {
@@ -14,18 +14,18 @@
14
14
  "dataset:diffs:generate": "ts-node src/dataset/diffs/generate.ts",
15
15
  "dataset:diffs:jsonl": "ts-node src/dataset/diffs/jsonl.ts",
16
16
  "prepublishOnly": "npm run compile",
17
- "lint": "tslint ./src/**/*.ts"
17
+ "lint": "tslint ./src/**/*.ts",
18
+ "lint:deps": "depcheck --config=.depcheckrc",
19
+ "lint:all": "npm run lint && npm run lint:deps"
18
20
  },
19
21
  "keywords": [],
20
22
  "author": "Micah Riggan",
21
23
  "license": "MIT",
22
24
  "devDependencies": {
23
25
  "@babel/preset-typescript": "^7.23.3",
24
- "@types/asana": "^0.18.16",
25
26
  "@types/diff": "^5.2.1",
26
27
  "@types/express": "^4.17.13",
27
28
  "@types/jest": "^29.5.13",
28
- "@types/jira-client": "^7.1.9",
29
29
  "@types/mocha": "^10.0.8",
30
30
  "@types/node": "^20.6.3",
31
31
  "@types/pdf-parse": "^1.1.4",
@@ -39,55 +39,26 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@anthropic-ai/sdk": "^0.39.0",
42
- "@aws-sdk/client-s3": "^3.588.0",
43
42
  "@google/genai": "^0.14.1",
44
43
  "@inquirer/editor": "^4.2.18",
45
- "@linear/sdk": "^12.0.0",
46
44
  "@modelcontextprotocol/sdk": "^1.13.3",
47
- "@notionhq/client": "^2.2.14",
48
- "@octokit/rest": "^20.0.2",
49
45
  "@simplewebauthn/server": "^13.3.0",
50
- "@types/react": "^19.1.8",
51
46
  "@tyvm/knowhow-tunnel": "0.0.4",
52
- "asana": "^3.0.16",
53
- "axios": "^1.5.0",
54
- "cheerio": "^1.0.0",
55
47
  "commander": "^14.0.0",
56
48
  "diff": "^5.2.0",
57
- "esbuild": "^0.25.8",
58
49
  "express": "^4.19.2",
59
- "figma-js": "^1.16.1-0",
60
50
  "gitignore-to-glob": "^0.3.0",
61
51
  "glob": "11.0.3",
62
- "ink": "^6.0.1",
63
52
  "isolated-vm": "^5.0.4",
64
- "jira-client": "^8.2.2",
65
53
  "jiti": "^2.6.1",
66
54
  "marked": "^10.0.0",
67
55
  "marked-terminal": "^6.2.0",
68
56
  "minimatch": "^10.1.2",
69
- "morgan": "^1.10.0",
70
- "node-fetch": "^3.2.3",
71
57
  "node-jq": "^6.0.1",
72
- "node-pty": "^1.0.0",
73
- "node-record-lpcm16": "^1.0.1",
74
58
  "openai": "4.89.1",
75
- "ora": "^5.4.1",
76
- "parse-diff": "^0.11.1",
77
59
  "pdf-parse": "^1.1.1",
78
- "playwright": "^1.52.0",
79
- "playwright-extra": "^4.3.6",
80
- "progress-estimator": "^0.3.1",
81
- "puppeteer": "^24.4.0",
82
- "puppeteer-extra-plugin-stealth": "^2.11.2",
83
- "react": "^19.1.0",
84
- "source-map-support": "^0.5.21",
85
- "tree-sitter": "^0.21.1",
86
- "tree-sitter-javascript": "^0.23.1",
87
- "tree-sitter-typescript": "^0.23.1",
88
60
  "typescript": "^4.6.3",
89
61
  "ws": "^8.18.1",
90
- "youtube-dl-exec": "^2.5.5",
91
62
  "zod": "^3.24.2"
92
63
  },
93
64
  "directories": {
@@ -101,5 +72,8 @@
101
72
  "bugs": {
102
73
  "url": "https://github.com/tyvm-ai/knowhow/issues"
103
74
  },
104
- "homepage": "https://github.com/tyvm-ai/knowhow#readme"
75
+ "homepage": "https://github.com/tyvm-ai/knowhow#readme",
76
+ "optionalDependencies": {
77
+ "esbuild-register": "^3.0.0"
78
+ }
105
79
  }
@@ -1,8 +1,8 @@
1
1
  import { AgentContext, BaseAgent } from "../base/base";
2
2
  import { Message } from "../../clients/types";
3
3
  import { Assistant, Config } from "../../types";
4
- import { EventService, ToolsService } from "src/services";
5
- import { MessageProcessor } from "src/services/MessageProcessor";
4
+ import { EventService, ToolsService } from "../../services";
5
+ import { MessageProcessor } from "../../services/MessageProcessor";
6
6
 
7
7
  export class ConfigAgent extends BaseAgent {
8
8
  name: string;
@@ -12,12 +12,14 @@ export async function executeScript({
12
12
  maxTokens,
13
13
  maxExecutionTimeMs,
14
14
  maxCostUsd,
15
+ allowNetworkAccess,
15
16
  }: {
16
17
  script: string;
17
18
  maxToolCalls?: number;
18
19
  maxTokens?: number;
19
20
  maxExecutionTimeMs?: number;
20
21
  maxCostUsd?: number;
22
+ allowNetworkAccess?: boolean;
21
23
  }) {
22
24
  try {
23
25
  // Get context from bound ToolsService
@@ -44,6 +46,9 @@ export async function executeScript({
44
46
  maxCostUsd: maxCostUsd || 1.0,
45
47
  maxMemoryMb: 100,
46
48
  },
49
+ policy: {
50
+ allowNetworkAccess: allowNetworkAccess ?? false,
51
+ },
47
52
  });
48
53
 
49
54
  // If there were policy violations, include them in the response
@@ -1,4 +1,4 @@
1
- import axios from "axios";
1
+ import http from "../../utils/http";
2
2
  import { Tool } from "../../clients/types";
3
3
 
4
4
  interface GoogleSearchParams {
@@ -180,7 +180,7 @@ export async function googleSearch(params: GoogleSearchParams) {
180
180
  }
181
181
 
182
182
  try {
183
- const response = await axios.get<GoogleSearchResponse>(url.toString());
183
+ const response = await http.get<GoogleSearchResponse>(url.toString());
184
184
  return transformGoogleSearchResponseForLLM(response.data);
185
185
  } catch (error) {
186
186
  console.error("Error performing Google search:", error);
@@ -14,8 +14,6 @@ export * from "./scanFile";
14
14
  export * from "./textSearch";
15
15
  export * from "./visionTool";
16
16
  export * from "./writeFile";
17
- export * from "./asana";
18
- export * from "./github";
19
17
  export * from "./fileSearch";
20
18
  export * from "./language";
21
19
  export * from "./askHuman";
@@ -24,7 +22,6 @@ export * from "./googleSearch";
24
22
  export * from "./loadWebpage";
25
23
  export * from "./stringReplace";
26
24
  export * from "./executeScript";
27
- export * from "./ast";
28
25
  export * from "./startAgentTask";
29
26
  export * from "./ycmd";
30
27
  export * from "./mcp";
@@ -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;
@@ -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
 
@@ -37,7 +37,6 @@ import {
37
37
  agents,
38
38
  } from "../../agents";
39
39
  import { ToolCallEvent } from "../../agents/base/base";
40
- import { $Command } from "@aws-sdk/client-s3";
41
40
  import { KnowhowSimpleClient } from "../../services/KnowhowClient";
42
41
 
43
42
  export class AgentModule extends BaseChatModule {
package/src/chat/types.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { ChatInteraction, Config } from "../types";
5
5
  import { BaseAgent } from "../agents/base/base";
6
- import { ToolsService } from "src/services";
6
+ import { ToolsService } from "../services";
7
7
  import { AgentRenderer } from "./renderer/types";
8
8
 
9
9
  export interface ChatContext {
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(