@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/src/login.ts CHANGED
@@ -1,4 +1,4 @@
1
- import axios from "axios";
1
+ import http from "./utils/http";
2
2
  import fs from "fs";
3
3
  import path from "path";
4
4
  import { chmod } from "fs/promises";
@@ -68,11 +68,10 @@ export async function login(jwtFlag?: boolean): Promise<void> {
68
68
  await updateConfig(config);
69
69
  }
70
70
  } catch (error) {
71
- if (axios.isAxiosError(error) && error.response) {
71
+ if (http.isHttpError(error) && error.response) {
72
+ const errData = await error.response.json().catch(() => ({ message: "Unknown error" }));
72
73
  throw new Error(
73
- `Error: ${error.response.status} - ${
74
- error.response.data.message || "Unknown error"
75
- }`
74
+ `Error: ${error.status} - ${errData.message || "Unknown error"}`
76
75
  );
77
76
  }
78
77
  console.log(
@@ -98,7 +97,7 @@ export async function loadJwt(): Promise<string> {
98
97
  }
99
98
 
100
99
  export async function checkJwt(storedJwt: string) {
101
- const response = await axios.get(`${KNOWHOW_API_URL}/api/users/me`, {
100
+ const response = await http.get(`${KNOWHOW_API_URL}/api/users/me`, {
102
101
  headers: {
103
102
  Authorization: `Bearer ${storedJwt}`,
104
103
  },
@@ -6,10 +6,6 @@ import { getConfig, getLanguageConfig } from "../config";
6
6
  import { getEnabledPlugins } from "../types";
7
7
  import { PluginBase, PluginMeta } from "./PluginBase";
8
8
  import { Plugin, PluginContext } from "./types";
9
- import { GitHubPlugin } from "./github";
10
- import { AsanaPlugin } from "./asana";
11
- import { JiraPlugin } from "./jira";
12
- import { LinearPlugin } from "./linear";
13
9
  import { PluginService } from "./plugins";
14
10
 
15
11
  /**
@@ -4,13 +4,6 @@ import { VimPlugin } from "./vim";
4
4
  import { LinterPlugin } from "./LinterPlugin";
5
5
  import { LanguagePlugin } from "./language";
6
6
  import { EmbeddingPlugin } from "./embedding";
7
- import { GitHubPlugin } from "./github";
8
- import { AsanaPlugin } from "./asana";
9
- import { LinearPlugin } from "./linear";
10
- import { JiraPlugin } from "./jira";
11
- import { NotionPlugin } from "./notion";
12
- import { DownloaderPlugin } from "./downloader/plugin";
13
- import { FigmaPlugin } from "./figma";
14
7
  import { UrlPlugin } from "./url";
15
8
  import { GitPlugin } from "./GitPlugin";
16
9
  import { TmuxPlugin } from "./tmux";
@@ -33,13 +26,6 @@ export class PluginService {
33
26
  this.pluginMap.set("embeddings", new EmbeddingPlugin(context));
34
27
  this.pluginMap.set("vim", new VimPlugin(context));
35
28
  this.pluginMap.set("linter", new LinterPlugin(context));
36
- this.pluginMap.set("github", new GitHubPlugin(context));
37
- this.pluginMap.set("asana", new AsanaPlugin(context));
38
- this.pluginMap.set("linear", new LinearPlugin(context));
39
- this.pluginMap.set("jira", new JiraPlugin(context));
40
- this.pluginMap.set("notion", new NotionPlugin(context));
41
- this.pluginMap.set("download", new DownloaderPlugin(context));
42
- this.pluginMap.set("figma", new FigmaPlugin(context));
43
29
  this.pluginMap.set("language", new LanguagePlugin(context));
44
30
  this.pluginMap.set("url", new UrlPlugin(context));
45
31
  this.pluginMap.set("git", new GitPlugin(context));
@@ -1,9 +1,6 @@
1
1
  import { PluginBase, PluginMeta } from "./PluginBase";
2
2
  import { Plugin, PluginContext } from "./types";
3
3
  import { MinimalEmbedding } from "../types";
4
- import axios from "axios";
5
- import * as cheerio from "cheerio";
6
- import loadWebpage from "../agents/tools/loadWebpage";
7
4
 
8
5
  export class UrlPlugin extends PluginBase implements Plugin {
9
6
  static readonly meta: PluginMeta = {
@@ -20,22 +17,47 @@ export class UrlPlugin extends PluginBase implements Plugin {
20
17
 
21
18
  async embed(userPrompt: string): Promise<MinimalEmbedding[]> {
22
19
  const urls = this.extractUrls(userPrompt);
23
- const embeddings = await Promise.all(urls.map(this.fetchAndParseUrl));
20
+ const embeddings = await Promise.all(urls.map((url) => this.fetchAndParseUrl(url)));
24
21
  return embeddings.filter((e): e is MinimalEmbedding => e !== null);
25
22
  }
26
23
 
27
24
  extractUrls(userPrompt: string): string[] {
28
25
  const urlRegex = /(https?:\/\/[^\s]+)/g;
29
26
  const urls = userPrompt.match(urlRegex) || [];
30
-
31
27
  return Array.from(new Set(urls));
32
28
  }
33
29
 
34
30
  async fetchAndParseUrl(url: string): Promise<MinimalEmbedding | null> {
35
31
  try {
36
- const text = await loadWebpage(url);
32
+ const response = await fetch(url, {
33
+ headers: {
34
+ "User-Agent": "Mozilla/5.0 (compatible; KnowhowBot/1.0)",
35
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
36
+ },
37
+ });
38
+
39
+ if (!response.ok) {
40
+ this.log(`URL PLUGIN: Failed to fetch ${url}: ${response.status}`, "warn");
41
+ return null;
42
+ }
43
+
44
+ const contentType = response.headers.get("content-type") || "";
45
+ let text = "";
46
+
47
+ if (contentType.includes("text/html") || contentType.includes("text/plain")) {
48
+ const html = await response.text();
49
+ // Simple HTML to text: strip tags
50
+ text = html
51
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "")
52
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "")
53
+ .replace(/<[^>]+>/g, " ")
54
+ .replace(/\s+/g, " ")
55
+ .trim();
56
+ } else {
57
+ text = await response.text();
58
+ }
37
59
 
38
- this.log(`URL PLUGIN: Fetched content from ${url}: ${text}`);
60
+ this.log(`URL PLUGIN: Fetched content from ${url}: ${text.substring(0, 100)}`);
39
61
 
40
62
  return {
41
63
  id: url + "-url",
@@ -58,7 +80,7 @@ export class UrlPlugin extends PluginBase implements Plugin {
58
80
  return "URL PLUGIN: Too many URLs detected. Skipping like unintentional bulk browse.";
59
81
  }
60
82
 
61
- const results = await Promise.all(urls.map(this.fetchAndParseUrl));
83
+ const results = await Promise.all(urls.map((url) => this.fetchAndParseUrl(url)));
62
84
  const validResults = results.filter(
63
85
  (r): r is MinimalEmbedding => r !== null
64
86
  );
@@ -70,10 +92,7 @@ export class UrlPlugin extends PluginBase implements Plugin {
70
92
  const formattedResults = validResults
71
93
  .map(
72
94
  (result) =>
73
- `URL: ${result.metadata.url}\n\nContent:\n${result.text.substring(
74
- 0,
75
- 500
76
- )}...`
95
+ `URL: ${result.metadata.url}\n\nContent:\n${result.text.substring(0, 500)}...`
77
96
  )
78
97
  .join("\n\n---\n\n");
79
98
 
@@ -1,5 +1,5 @@
1
1
  import { Octokit } from "@octokit/rest";
2
- import axios from "axios";
2
+ import http from "../utils/http";
3
3
 
4
4
  export class GitHubService {
5
5
  octokit: Octokit;
@@ -22,7 +22,7 @@ export class GitHubService {
22
22
  }
23
23
 
24
24
  private async getLfsContent(downloadUrl: string): Promise<string> {
25
- const response = await axios.get(downloadUrl);
25
+ const response = await http.get(downloadUrl);
26
26
  return JSON.stringify(response.data);
27
27
  }
28
28
 
@@ -1,4 +1,4 @@
1
- import axios from "axios";
1
+ import http from "../utils/http";
2
2
  import fs from "fs";
3
3
  import { Message } from "../clients/types";
4
4
  import path from "path";
@@ -110,7 +110,7 @@ export const KNOWHOW_API_URL =
110
110
  process.env.KNOWHOW_API_URL || "https://api.knowhow.tyvm.ai";
111
111
 
112
112
  export class KnowhowSimpleClient {
113
- headers = {};
113
+ headers: Record<string, string> = {};
114
114
  jwtValidated = false;
115
115
 
116
116
  constructor(
@@ -156,7 +156,7 @@ export class KnowhowSimpleClient {
156
156
  throw new Error("No JWT found. Please login first.");
157
157
  }
158
158
 
159
- return axios.get(`${this.baseUrl}/api/users/me`, {
159
+ return http.get(`${this.baseUrl}/api/users/me`, {
160
160
  headers: this.headers,
161
161
  });
162
162
  }
@@ -164,7 +164,7 @@ export class KnowhowSimpleClient {
164
164
  async getPresignedUploadUrl(source: Config["embedSources"][0]) {
165
165
  await this.checkJwt();
166
166
  const id = source.remoteId;
167
- const presignedUrlResp = await axios.post(
167
+ const presignedUrlResp = await http.post(
168
168
  `${this.baseUrl}/api/org-embeddings/${id}/upload`,
169
169
  {},
170
170
  {
@@ -181,7 +181,7 @@ export class KnowhowSimpleClient {
181
181
  async getPresignedDownloadUrl(source: Config["embedSources"][0]) {
182
182
  await this.checkJwt();
183
183
  const id = source.remoteId;
184
- const presignedUrlResp = await axios.post(
184
+ const presignedUrlResp = await http.post(
185
185
  `${this.baseUrl}/api/org-embeddings/${id}/download`,
186
186
  {},
187
187
  {
@@ -203,7 +203,7 @@ export class KnowhowSimpleClient {
203
203
  }
204
204
  ) {
205
205
  await this.checkJwt();
206
- return axios.put(
206
+ return http.put(
207
207
  `${this.baseUrl}/api/org-embeddings/${id}`,
208
208
  data,
209
209
  {
@@ -214,7 +214,7 @@ export class KnowhowSimpleClient {
214
214
 
215
215
  async createChatCompletion(options: CompletionOptions) {
216
216
  await this.checkJwt();
217
- return axios.post<CompletionResponse>(
217
+ return http.post<CompletionResponse>(
218
218
  `${this.baseUrl}/api/proxy/v1/chat/completions`,
219
219
  options,
220
220
  {
@@ -225,7 +225,7 @@ export class KnowhowSimpleClient {
225
225
 
226
226
  async createEmbedding(options: EmbeddingOptions) {
227
227
  await this.checkJwt();
228
- return axios.post<EmbeddingResponse>(
228
+ return http.post<EmbeddingResponse>(
229
229
  `${this.baseUrl}/api/proxy/v1/embeddings`,
230
230
  options,
231
231
  {
@@ -236,7 +236,7 @@ export class KnowhowSimpleClient {
236
236
 
237
237
  async getModels() {
238
238
  await this.checkJwt();
239
- return axios.get(`${this.baseUrl}/api/proxy/v1/models?type=all`, {
239
+ return http.get(`${this.baseUrl}/api/proxy/v1/models?type=all`, {
240
240
  headers: this.headers,
241
241
  });
242
242
  }
@@ -262,7 +262,7 @@ export class KnowhowSimpleClient {
262
262
  if (options.temperature != null)
263
263
  formData.append("temperature", String(options.temperature));
264
264
 
265
- return axios.post<AudioTranscriptionResponse>(
265
+ return http.post<AudioTranscriptionResponse>(
266
266
  `${this.baseUrl}/api/proxy/v1/audio/transcriptions`,
267
267
  formData,
268
268
  { headers: { ...this.headers } }
@@ -271,7 +271,7 @@ export class KnowhowSimpleClient {
271
271
 
272
272
  async createAudioGeneration(options: AudioGenerationOptions) {
273
273
  await this.checkJwt();
274
- return axios.post<AudioGenerationResponse>(
274
+ return http.post<AudioGenerationResponse>(
275
275
  `${this.baseUrl}/api/proxy/v1/audio/generations`,
276
276
  options,
277
277
  { headers: this.headers }
@@ -280,7 +280,7 @@ export class KnowhowSimpleClient {
280
280
 
281
281
  async createImageGeneration(options: ImageGenerationOptions) {
282
282
  await this.checkJwt();
283
- return axios.post<ImageGenerationResponse>(
283
+ return http.post<ImageGenerationResponse>(
284
284
  `${this.baseUrl}/api/proxy/v1/images/generations`,
285
285
  options,
286
286
  { headers: this.headers }
@@ -289,7 +289,7 @@ export class KnowhowSimpleClient {
289
289
 
290
290
  async createVideoGeneration(options: VideoGenerationOptions) {
291
291
  await this.checkJwt();
292
- return axios.post<VideoGenerationResponse>(
292
+ return http.post<VideoGenerationResponse>(
293
293
  `${this.baseUrl}/api/proxy/v1/videos/generations`,
294
294
  options,
295
295
  { headers: this.headers }
@@ -299,7 +299,7 @@ export class KnowhowSimpleClient {
299
299
  async getVideoStatus(options: VideoStatusOptions) {
300
300
  await this.checkJwt();
301
301
  const { jobId, ...rest } = options;
302
- return axios.get<VideoStatusResponse>(
302
+ return http.get<VideoStatusResponse>(
303
303
  `${this.baseUrl}/api/proxy/v1/videos/${jobId}/status`,
304
304
  { headers: this.headers, params: rest }
305
305
  );
@@ -308,7 +308,7 @@ export class KnowhowSimpleClient {
308
308
  async downloadVideo(options: FileDownloadOptions) {
309
309
  await this.checkJwt();
310
310
  const { fileId } = options;
311
- return axios.get<ArrayBuffer>(
311
+ return http.get<ArrayBuffer>(
312
312
  `${this.baseUrl}/api/proxy/v1/videos/${fileId}/content`,
313
313
  { headers: this.headers, responseType: "arraybuffer" }
314
314
  );
@@ -323,7 +323,7 @@ export class KnowhowSimpleClient {
323
323
  fileName: options.fileName,
324
324
  displayName: options.displayName,
325
325
  };
326
- return axios.post<FileUploadResponse>(
326
+ return http.post<FileUploadResponse>(
327
327
  `${this.baseUrl}/api/proxy/v1/files`,
328
328
  body,
329
329
  { headers: this.headers }
@@ -333,7 +333,7 @@ export class KnowhowSimpleClient {
333
333
  async downloadFile(options: FileDownloadOptions) {
334
334
  await this.checkJwt();
335
335
  const { fileId } = options;
336
- return axios.get<ArrayBuffer>(
336
+ return http.get<ArrayBuffer>(
337
337
  `${this.baseUrl}/api/proxy/v1/files/${fileId}/content`,
338
338
  { headers: this.headers, responseType: "arraybuffer" }
339
339
  );
@@ -341,7 +341,7 @@ export class KnowhowSimpleClient {
341
341
 
342
342
  async createChatTask(request: CreateMessageTaskRequest) {
343
343
  await this.checkJwt();
344
- return axios.post<CreateMessageTaskResponse>(
344
+ return http.post<CreateMessageTaskResponse>(
345
345
  `${this.baseUrl}/api/chat/tasks`,
346
346
  request,
347
347
  {
@@ -352,7 +352,7 @@ export class KnowhowSimpleClient {
352
352
 
353
353
  async updateChatTask(taskId: string, updates: UpdateOrgTaskRequest) {
354
354
  await this.checkJwt();
355
- return axios.put<UpdateOrgTaskResponse>(
355
+ return http.put<UpdateOrgTaskResponse>(
356
356
  `${this.baseUrl}/api/chat/tasks/${taskId}`,
357
357
  updates,
358
358
  {
@@ -370,7 +370,7 @@ export class KnowhowSimpleClient {
370
370
  */
371
371
  async getTaskDetails(taskId: string) {
372
372
  await this.checkJwt();
373
- return axios.get<TaskDetailsResponse>(
373
+ return http.get<TaskDetailsResponse>(
374
374
  `${this.baseUrl}/api/org-agent-tasks/${taskId}`,
375
375
  {
376
376
  headers: this.headers,
@@ -383,7 +383,7 @@ export class KnowhowSimpleClient {
383
383
  */
384
384
  async getPendingMessages(taskId: string) {
385
385
  await this.checkJwt();
386
- return axios.get<PendingMessage[]>(
386
+ return http.get<PendingMessage[]>(
387
387
  `${this.baseUrl}/api/org-agent-tasks/${taskId}/pending-messages`,
388
388
  {
389
389
  headers: this.headers,
@@ -396,7 +396,7 @@ export class KnowhowSimpleClient {
396
396
  */
397
397
  async markMessagesAsProcessed(taskId: string, messageIds: string[]) {
398
398
  await this.checkJwt();
399
- return axios.post<MarkProcessedResponse>(
399
+ return http.post<MarkProcessedResponse>(
400
400
  `${this.baseUrl}/api/org-agent-tasks/${taskId}/pending-messages/mark-processed`,
401
401
  { messageIds },
402
402
  {
@@ -414,7 +414,7 @@ export class KnowhowSimpleClient {
414
414
  role: "user" | "system" = "user"
415
415
  ) {
416
416
  await this.checkJwt();
417
- return axios.post<SendMessageResponse>(
417
+ return http.post<SendMessageResponse>(
418
418
  `${this.baseUrl}/api/org-agent-tasks/${taskId}/messages`,
419
419
  { message, role },
420
420
  {
@@ -428,7 +428,7 @@ export class KnowhowSimpleClient {
428
428
  */
429
429
  async pauseAgent(taskId: string) {
430
430
  await this.checkJwt();
431
- return axios.post<StatusResponse>(
431
+ return http.post<StatusResponse>(
432
432
  `${this.baseUrl}/api/org-agent-tasks/${taskId}/pause`,
433
433
  {},
434
434
  {
@@ -442,7 +442,7 @@ export class KnowhowSimpleClient {
442
442
  */
443
443
  async resumeAgent(taskId: string) {
444
444
  await this.checkJwt();
445
- return axios.post<StatusResponse>(
445
+ return http.post<StatusResponse>(
446
446
  `${this.baseUrl}/api/org-agent-tasks/${taskId}/resume`,
447
447
  {},
448
448
  {
@@ -464,7 +464,7 @@ export class KnowhowSimpleClient {
464
464
  */
465
465
  async killAgent(taskId: string) {
466
466
  await this.checkJwt();
467
- return axios.post<StatusResponse>(
467
+ return http.post<StatusResponse>(
468
468
  `${this.baseUrl}/api/org-agent-tasks/${taskId}/kill`,
469
469
  {},
470
470
  {
@@ -483,7 +483,7 @@ export class KnowhowSimpleClient {
483
483
  */
484
484
  async listOrgFiles() {
485
485
  await this.checkJwt();
486
- return axios.get<
486
+ return http.get<
487
487
  { id: string; fileName: string; folderPath: string; name: string }[]
488
488
  >(`${this.baseUrl}/api/org-files`, { headers: this.headers });
489
489
  }
@@ -493,7 +493,7 @@ export class KnowhowSimpleClient {
493
493
  */
494
494
  async createOrgFile(fileName: string, folderPath: string) {
495
495
  await this.checkJwt();
496
- return axios.post<{
496
+ return http.post<{
497
497
  id: string;
498
498
  fileName: string;
499
499
  folderPath: string;
@@ -510,7 +510,7 @@ export class KnowhowSimpleClient {
510
510
  */
511
511
  async getOrgFileText(fileId: string) {
512
512
  await this.checkJwt();
513
- return axios.get<string>(`${this.baseUrl}/api/org-files/${fileId}/text`, {
513
+ return http.get<string>(`${this.baseUrl}/api/org-files/${fileId}/text`, {
514
514
  headers: this.headers,
515
515
  params: { reading: "true" },
516
516
  });
@@ -521,7 +521,7 @@ export class KnowhowSimpleClient {
521
521
  */
522
522
  async updateOrgFileText(fileId: string, text: string) {
523
523
  await this.checkJwt();
524
- return axios.put(
524
+ return http.put(
525
525
  `${this.baseUrl}/api/org-files/${fileId}/text`,
526
526
  { text },
527
527
  { headers: this.headers }
@@ -590,7 +590,7 @@ export class KnowhowSimpleClient {
590
590
  }
591
591
 
592
592
  // Get download URL using the file ID
593
- const response = await axios.post<{ downloadUrl: string }>(
593
+ const response = await http.post<{ downloadUrl: string }>(
594
594
  `${this.baseUrl}/api/org-files/download/${file.id}`,
595
595
  {},
596
596
  { headers: this.headers }
@@ -609,7 +609,7 @@ export class KnowhowSimpleClient {
609
609
  throw new Error(`File not found: ${filePath}`);
610
610
  }
611
611
 
612
- await axios.post(`${this.baseUrl}/api/org-files/upload/${file.id}/complete`, {}, { headers: this.headers });
612
+ await http.post(`${this.baseUrl}/api/org-files/upload/${file.id}/complete`, {}, { headers: this.headers });
613
613
  }
614
614
 
615
615
  /**
@@ -627,7 +627,7 @@ export class KnowhowSimpleClient {
627
627
  const fileName = lastSlash >= 0 ? filePath.substring(lastSlash + 1) : filePath;
628
628
 
629
629
  // Get upload URL using the file ID
630
- const response = await axios.post<{ uploadUrl: string }>(
630
+ const response = await http.post<{ uploadUrl: string }>(
631
631
  `${this.baseUrl}/api/org-files/upload/${file.id}`,
632
632
  { fileName },
633
633
  { headers: this.headers }
@@ -641,7 +641,7 @@ export class KnowhowSimpleClient {
641
641
  */
642
642
  async getGitCredential(repo: string): Promise<GitCredentialResponse> {
643
643
  await this.checkJwt();
644
- const response = await axios.post<GitCredentialResponse>(
644
+ const response = await http.post<GitCredentialResponse>(
645
645
  `${this.baseUrl}/api/github/git-credential`,
646
646
  { repo },
647
647
  { headers: this.headers }