@tyvm/knowhow 0.0.90 → 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 (262) hide show
  1. package/.depcheckrc +31 -0
  2. package/bin/knowhow.js +1 -1
  3. package/package.json +4 -32
  4. package/src/agents/tools/executeScript/index.ts +5 -0
  5. package/src/agents/tools/googleSearch.ts +2 -2
  6. package/src/agents/tools/index.ts +0 -3
  7. package/src/agents/tools/list.ts +0 -147
  8. package/src/agents/tools/loadWebpage.ts +3 -113
  9. package/src/auth/browserLogin.ts +10 -13
  10. package/src/cli.ts +63 -3
  11. package/src/clients/gemini.ts +96 -25
  12. package/src/clients/http.ts +7 -11
  13. package/src/clients/pricing/google.ts +122 -26
  14. package/src/conversion.ts +24 -54
  15. package/src/index.ts +8 -1
  16. package/src/login.ts +5 -6
  17. package/src/plugins/language.ts +0 -4
  18. package/src/plugins/plugins.ts +0 -14
  19. package/src/plugins/url.ts +31 -12
  20. package/src/services/GitHub.ts +2 -2
  21. package/src/services/KnowhowClient.ts +34 -34
  22. package/src/{plugins/downloader/downloader.ts → services/MediaProcessorService.ts} +109 -267
  23. package/src/services/S3.ts +16 -16
  24. package/src/services/index.ts +4 -4
  25. package/src/services/modules/index.ts +10 -2
  26. package/src/services/modules/types.ts +5 -2
  27. package/src/services/script-execution/ScriptExecutor.ts +29 -10
  28. package/src/services/script-execution/ScriptPolicy.ts +6 -2
  29. package/src/types.ts +1 -0
  30. package/src/utils/http.ts +127 -0
  31. package/src/workers/auth/PasskeySetup.ts +7 -11
  32. package/tests/clients/AIClient.test.ts +24 -21
  33. package/tests/manual/file-edits/figma.test.ts +3 -70
  34. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +2 -0
  35. package/tests/plugins/language/languagePlugin.test.ts +2 -0
  36. package/tests/processors/ToolResponseCache.test.ts +2 -2
  37. package/tests/test.spec.ts +0 -14
  38. package/tests/unit/modules/moduleLoading.test.ts +7 -4
  39. package/tests/unit/plugins/pluginLoading.test.ts +6 -6
  40. package/ts_build/package.json +4 -32
  41. package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -1
  42. package/ts_build/src/agents/tools/ast/astAppendNode.js +2 -90
  43. package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -1
  44. package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -1
  45. package/ts_build/src/agents/tools/ast/astDeleteNode.js +2 -88
  46. package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -1
  47. package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -1
  48. package/ts_build/src/agents/tools/ast/astEditNode.js +2 -90
  49. package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -1
  50. package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -1
  51. package/ts_build/src/agents/tools/ast/astGetPathForLine.js +2 -72
  52. package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -1
  53. package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -1
  54. package/ts_build/src/agents/tools/ast/astListPaths.js +2 -72
  55. package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -1
  56. package/ts_build/src/agents/tools/executeScript/index.d.ts +3 -2
  57. package/ts_build/src/agents/tools/executeScript/index.js +4 -1
  58. package/ts_build/src/agents/tools/executeScript/index.js.map +1 -1
  59. package/ts_build/src/agents/tools/googleSearch.js +2 -2
  60. package/ts_build/src/agents/tools/googleSearch.js.map +1 -1
  61. package/ts_build/src/agents/tools/index.d.ts +0 -3
  62. package/ts_build/src/agents/tools/index.js +0 -3
  63. package/ts_build/src/agents/tools/index.js.map +1 -1
  64. package/ts_build/src/agents/tools/list.js +0 -138
  65. package/ts_build/src/agents/tools/list.js.map +1 -1
  66. package/ts_build/src/agents/tools/loadWebpage.js +1 -89
  67. package/ts_build/src/agents/tools/loadWebpage.js.map +1 -1
  68. package/ts_build/src/agents/tools/textSearch.d.ts +1 -1
  69. package/ts_build/src/auth/browserLogin.js +7 -7
  70. package/ts_build/src/auth/browserLogin.js.map +1 -1
  71. package/ts_build/src/cli.d.ts +1 -1
  72. package/ts_build/src/cli.js +47 -1
  73. package/ts_build/src/cli.js.map +1 -1
  74. package/ts_build/src/clients/gemini.d.ts +1 -73
  75. package/ts_build/src/clients/gemini.js +57 -19
  76. package/ts_build/src/clients/gemini.js.map +1 -1
  77. package/ts_build/src/clients/http.js +5 -9
  78. package/ts_build/src/clients/http.js.map +1 -1
  79. package/ts_build/src/clients/pricing/google.d.ts +17 -73
  80. package/ts_build/src/clients/pricing/google.js +47 -10
  81. package/ts_build/src/clients/pricing/google.js.map +1 -1
  82. package/ts_build/src/conversion.d.ts +1 -4
  83. package/ts_build/src/conversion.js +12 -27
  84. package/ts_build/src/conversion.js.map +1 -1
  85. package/ts_build/src/index.d.ts +4 -0
  86. package/ts_build/src/index.js +7 -1
  87. package/ts_build/src/index.js.map +1 -1
  88. package/ts_build/src/login.js +5 -4
  89. package/ts_build/src/login.js.map +1 -1
  90. package/ts_build/src/plugins/downloader/downloader.js +3 -3
  91. package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
  92. package/ts_build/src/plugins/language.js.map +1 -1
  93. package/ts_build/src/plugins/plugins.js +0 -14
  94. package/ts_build/src/plugins/plugins.js.map +1 -1
  95. package/ts_build/src/plugins/tree-sitter/editor.d.ts +3 -32
  96. package/ts_build/src/plugins/tree-sitter/editor.js +6 -208
  97. package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -1
  98. package/ts_build/src/plugins/tree-sitter/parser.d.ts +19 -54
  99. package/ts_build/src/plugins/tree-sitter/parser.js +19 -293
  100. package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -1
  101. package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +2 -15
  102. package/ts_build/src/plugins/tree-sitter/simple-paths.js +2 -324
  103. package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -1
  104. package/ts_build/src/plugins/url.js +27 -8
  105. package/ts_build/src/plugins/url.js.map +1 -1
  106. package/ts_build/src/services/GitHub.js +2 -2
  107. package/ts_build/src/services/GitHub.js.map +1 -1
  108. package/ts_build/src/services/KnowhowClient.d.ts +29 -29
  109. package/ts_build/src/services/KnowhowClient.js +33 -33
  110. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  111. package/ts_build/src/services/MediaProcessorService.d.ts +22 -0
  112. package/ts_build/src/services/MediaProcessorService.js +215 -0
  113. package/ts_build/src/services/MediaProcessorService.js.map +1 -0
  114. package/ts_build/src/services/S3.js +12 -18
  115. package/ts_build/src/services/S3.js.map +1 -1
  116. package/ts_build/src/services/index.d.ts +3 -2
  117. package/ts_build/src/services/index.js +3 -3
  118. package/ts_build/src/services/index.js.map +1 -1
  119. package/ts_build/src/services/modules/index.js +10 -2
  120. package/ts_build/src/services/modules/index.js.map +1 -1
  121. package/ts_build/src/services/modules/types.d.ts +5 -2
  122. package/ts_build/src/services/script-execution/ScriptExecutor.js +22 -7
  123. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
  124. package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +1 -1
  125. package/ts_build/src/services/script-execution/ScriptPolicy.js +4 -2
  126. package/ts_build/src/services/script-execution/ScriptPolicy.js.map +1 -1
  127. package/ts_build/src/types.d.ts +1 -0
  128. package/ts_build/src/types.js +1 -0
  129. package/ts_build/src/types.js.map +1 -1
  130. package/ts_build/src/utils/http.d.ts +27 -0
  131. package/ts_build/src/utils/http.js +98 -0
  132. package/ts_build/src/utils/http.js.map +1 -0
  133. package/ts_build/src/workers/auth/PasskeySetup.js +6 -7
  134. package/ts_build/src/workers/auth/PasskeySetup.js.map +1 -1
  135. package/ts_build/tests/clients/AIClient.test.js +11 -14
  136. package/ts_build/tests/clients/AIClient.test.js.map +1 -1
  137. package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -1
  138. package/ts_build/tests/manual/file-edits/figma.test.js +1 -46
  139. package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -1
  140. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +2 -0
  141. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -1
  142. package/ts_build/tests/plugins/language/languagePlugin.test.js +2 -0
  143. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -1
  144. package/ts_build/tests/processors/ToolResponseCache.test.js +2 -2
  145. package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -1
  146. package/ts_build/tests/test.spec.js +0 -14
  147. package/ts_build/tests/test.spec.js.map +1 -1
  148. package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +0 -1
  149. package/ts_build/tests/tree-sitter/tree-sitter.test.js +2 -183
  150. package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -1
  151. package/ts_build/tests/unit/modules/moduleLoading.test.js +6 -4
  152. package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
  153. package/ts_build/tests/unit/plugins/pluginLoading.test.js +4 -4
  154. package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +1 -1
  155. package/benchmarks/.dockerignore +0 -7
  156. package/benchmarks/README.md +0 -166
  157. package/benchmarks/docker/Dockerfile +0 -68
  158. package/benchmarks/example-config.yml +0 -27
  159. package/benchmarks/jest.config.js +0 -13
  160. package/benchmarks/package-lock.json +0 -4297
  161. package/benchmarks/package.json +0 -39
  162. package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +0 -2909
  163. package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -1671
  164. package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +0 -2814
  165. package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -2014
  166. package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3121
  167. package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +0 -98
  168. package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +0 -3256
  169. package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +0 -4298
  170. package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3031
  171. package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -2990
  172. package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3256
  173. package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3007
  174. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -3256
  175. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +0 -3036
  176. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +0 -3280
  177. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -1920
  178. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +0 -3281
  179. package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +0 -2896
  180. package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3011
  181. package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +0 -3003
  182. package/benchmarks/scripts/build-and-run.sh +0 -47
  183. package/benchmarks/scripts/clone-exercism.sh +0 -92
  184. package/benchmarks/scripts/validate.sh +0 -48
  185. package/benchmarks/src/__tests__/runner.test.ts +0 -27
  186. package/benchmarks/src/cli.ts +0 -90
  187. package/benchmarks/src/evaluators/EvaluatorRegistry.ts +0 -64
  188. package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +0 -183
  189. package/benchmarks/src/evaluators/index.ts +0 -3
  190. package/benchmarks/src/evaluators/types.ts +0 -22
  191. package/benchmarks/src/index.ts +0 -3
  192. package/benchmarks/src/providers.ts +0 -13
  193. package/benchmarks/src/runner.ts +0 -824
  194. package/benchmarks/src/types.ts +0 -63
  195. package/benchmarks/tsconfig.json +0 -19
  196. package/leaderboard/README.md +0 -148
  197. package/leaderboard/app/api/benchmark-data/route.ts +0 -131
  198. package/leaderboard/app/api/benchmark-detail/route.ts +0 -172
  199. package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +0 -501
  200. package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +0 -375
  201. package/leaderboard/app/globals.css +0 -27
  202. package/leaderboard/app/layout.tsx +0 -21
  203. package/leaderboard/app/page.tsx +0 -170
  204. package/leaderboard/components/LeaderboardTable.tsx +0 -168
  205. package/leaderboard/components/PerformanceChart.tsx +0 -109
  206. package/leaderboard/next-env.d.ts +0 -5
  207. package/leaderboard/next.config.js +0 -4
  208. package/leaderboard/package-lock.json +0 -6363
  209. package/leaderboard/package.json +0 -28
  210. package/leaderboard/postcss.config.js +0 -6
  211. package/leaderboard/tailwind.config.js +0 -17
  212. package/leaderboard/tsconfig.json +0 -28
  213. package/leaderboard/types/benchmark.ts +0 -67
  214. package/leaderboard/utils/dataProcessor.ts +0 -33
  215. package/src/agents/tools/asana/definitions.ts +0 -199
  216. package/src/agents/tools/asana/index.ts +0 -108
  217. package/src/agents/tools/ast/astAppendNode.ts +0 -90
  218. package/src/agents/tools/ast/astDeleteNode.ts +0 -88
  219. package/src/agents/tools/ast/astEditNode.ts +0 -95
  220. package/src/agents/tools/ast/astGetPathForLine.ts +0 -73
  221. package/src/agents/tools/ast/astListPaths.ts +0 -66
  222. package/src/agents/tools/ast/index.ts +0 -7
  223. package/src/agents/tools/github/definitions.ts +0 -89
  224. package/src/agents/tools/github/index.ts +0 -67
  225. package/src/chat-old.ts +0 -446
  226. package/src/plugins/asana.ts +0 -146
  227. package/src/plugins/downloader/plugin.ts +0 -103
  228. package/src/plugins/downloader/types.ts +0 -92
  229. package/src/plugins/figma.ts +0 -158
  230. package/src/plugins/github.ts +0 -219
  231. package/src/plugins/jira.ts +0 -115
  232. package/src/plugins/linear.ts +0 -230
  233. package/src/plugins/notion.ts +0 -179
  234. package/src/plugins/tree-sitter/editor.ts +0 -369
  235. package/src/plugins/tree-sitter/lang-packs/index.ts +0 -23
  236. package/src/plugins/tree-sitter/lang-packs/java.ts +0 -59
  237. package/src/plugins/tree-sitter/lang-packs/javascript.ts +0 -57
  238. package/src/plugins/tree-sitter/lang-packs/python.ts +0 -45
  239. package/src/plugins/tree-sitter/lang-packs/types.ts +0 -79
  240. package/src/plugins/tree-sitter/lang-packs/typescript.ts +0 -49
  241. package/src/plugins/tree-sitter/parser.ts +0 -470
  242. package/src/plugins/tree-sitter/simple-paths.ts +0 -467
  243. package/tests/tree-sitter/editor.test.ts +0 -113
  244. package/tests/tree-sitter/invalid.test.ts +0 -299
  245. package/tests/tree-sitter/paths/common-edits.test.ts +0 -564
  246. package/tests/tree-sitter/paths/debug-exact-position.test.ts +0 -44
  247. package/tests/tree-sitter/paths/debug-line-indexing.test.ts +0 -49
  248. package/tests/tree-sitter/paths/debug-paths.test.ts +0 -90
  249. package/tests/tree-sitter/paths/paths.test.ts +0 -170
  250. package/tests/tree-sitter/paths/simple-paths.test.ts +0 -367
  251. package/tests/tree-sitter/sample-after.ts +0 -48
  252. package/tests/tree-sitter/sample-before.ts +0 -25
  253. package/tests/tree-sitter/test-files/completely-broken.ts +0 -7
  254. package/tests/tree-sitter/test-files/duplicate-braces.ts +0 -39
  255. package/tests/tree-sitter/test-files/invalid-nesting.ts +0 -39
  256. package/tests/tree-sitter/test-files/malformed-signature.ts +0 -39
  257. package/tests/tree-sitter/test-files/mismatched-parens.ts +0 -39
  258. package/tests/tree-sitter/test-files/missing-semicolon.ts +0 -39
  259. package/tests/tree-sitter/test-files/partially-broken.ts +0 -20
  260. package/tests/tree-sitter/test-files/specific-errors.ts +0 -14
  261. package/tests/tree-sitter/test-files/unclosed-string.ts +0 -39
  262. package/tests/tree-sitter/tree-sitter.test.ts +0 -251
package/.depcheckrc ADDED
@@ -0,0 +1,31 @@
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
+ "skip-missing": true,
22
+ "ignore-patterns": [
23
+ "src/dataset/**",
24
+ "ts_build/**",
25
+ "node_modules/**",
26
+ "tests/**"
27
+ ],
28
+ "specials": [
29
+ "depcheck-special-bin"
30
+ ]
31
+ }
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.91",
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",
@@ -42,52 +42,24 @@
42
42
  "@aws-sdk/client-s3": "^3.588.0",
43
43
  "@google/genai": "^0.14.1",
44
44
  "@inquirer/editor": "^4.2.18",
45
- "@linear/sdk": "^12.0.0",
46
45
  "@modelcontextprotocol/sdk": "^1.13.3",
47
- "@notionhq/client": "^2.2.14",
48
- "@octokit/rest": "^20.0.2",
49
46
  "@simplewebauthn/server": "^13.3.0",
50
- "@types/react": "^19.1.8",
51
47
  "@tyvm/knowhow-tunnel": "0.0.4",
52
- "asana": "^3.0.16",
53
- "axios": "^1.5.0",
54
- "cheerio": "^1.0.0",
55
48
  "commander": "^14.0.0",
56
49
  "diff": "^5.2.0",
57
- "esbuild": "^0.25.8",
58
50
  "express": "^4.19.2",
59
- "figma-js": "^1.16.1-0",
60
51
  "gitignore-to-glob": "^0.3.0",
61
52
  "glob": "11.0.3",
62
- "ink": "^6.0.1",
63
53
  "isolated-vm": "^5.0.4",
64
- "jira-client": "^8.2.2",
65
54
  "jiti": "^2.6.1",
66
55
  "marked": "^10.0.0",
67
56
  "marked-terminal": "^6.2.0",
68
57
  "minimatch": "^10.1.2",
69
- "morgan": "^1.10.0",
70
- "node-fetch": "^3.2.3",
71
58
  "node-jq": "^6.0.1",
72
- "node-pty": "^1.0.0",
73
- "node-record-lpcm16": "^1.0.1",
74
59
  "openai": "4.89.1",
75
- "ora": "^5.4.1",
76
- "parse-diff": "^0.11.1",
77
60
  "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
61
  "typescript": "^4.6.3",
89
62
  "ws": "^8.18.1",
90
- "youtube-dl-exec": "^2.5.5",
91
63
  "zod": "^3.24.2"
92
64
  },
93
65
  "directories": {
@@ -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
 
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(