@tyvm/knowhow 0.0.47 → 0.0.49

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 (459) hide show
  1. package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +2909 -0
  2. package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +1671 -0
  3. package/jest.config.js +2 -2
  4. package/package.json +8 -3
  5. package/src/agents/base/base.ts +39 -25
  6. package/src/agents/patcher/patcher.ts +26 -5
  7. package/src/agents/tools/agentCall.ts +4 -2
  8. package/src/agents/tools/aiClient.ts +3 -11
  9. package/src/agents/tools/ast/astAppendNode.ts +90 -0
  10. package/src/agents/tools/ast/astDeleteNode.ts +88 -0
  11. package/src/agents/tools/ast/astEditNode.ts +95 -0
  12. package/src/agents/tools/ast/astGetPathForLine.ts +73 -0
  13. package/src/agents/tools/ast/astListPaths.ts +66 -0
  14. package/src/agents/tools/ast/index.ts +7 -0
  15. package/src/agents/tools/callPlugin.ts +8 -2
  16. package/src/agents/tools/embeddingSearch.ts +2 -1
  17. package/src/agents/tools/execCommand.ts +239 -94
  18. package/src/agents/tools/fileSearch.ts +15 -17
  19. package/src/agents/tools/index.ts +1 -0
  20. package/src/agents/tools/language/definitions.ts +10 -2
  21. package/src/agents/tools/language/index.ts +3 -2
  22. package/src/agents/tools/lintFile.ts +4 -2
  23. package/src/agents/tools/list.ts +203 -62
  24. package/src/agents/tools/patch.ts +48 -14
  25. package/src/agents/tools/readBlocks.ts +34 -0
  26. package/src/agents/tools/readFile.ts +23 -0
  27. package/src/agents/tools/stringReplace.ts +33 -9
  28. package/src/agents/tools/writeFile.ts +55 -0
  29. package/src/agents/tools/ycmd/server.ts +14 -4
  30. package/src/chat/CliChatService.ts +6 -1
  31. package/src/chat/modules/AgentModule.ts +129 -67
  32. package/src/chat/modules/AskModule.ts +0 -1
  33. package/src/chat/modules/SetupModule.ts +4 -4
  34. package/src/chat/modules/SystemModule.ts +28 -5
  35. package/src/chat/types.ts +2 -0
  36. package/src/chat-old.ts +2 -2
  37. package/src/clients/anthropic.ts +22 -1
  38. package/src/clients/openai.ts +1 -1
  39. package/src/clients/xai.ts +15 -5
  40. package/src/config.ts +17 -5
  41. package/src/dataset/diffs/generate.ts +2 -2
  42. package/src/dataset/diffs/jsonl.ts +0 -1
  43. package/src/embeddings.ts +8 -8
  44. package/src/index.ts +11 -5
  45. package/src/plugins/GitPlugin.ts +530 -0
  46. package/src/plugins/LinterPlugin.ts +89 -0
  47. package/src/plugins/PluginBase.ts +4 -2
  48. package/src/plugins/asana.ts +4 -2
  49. package/src/plugins/downloader/plugin.ts +5 -2
  50. package/src/plugins/embedding.ts +24 -4
  51. package/src/plugins/figma.ts +7 -3
  52. package/src/plugins/github.ts +4 -2
  53. package/src/plugins/jira.ts +4 -2
  54. package/src/plugins/language.ts +134 -27
  55. package/src/plugins/linear.ts +4 -2
  56. package/src/plugins/notion.ts +4 -2
  57. package/src/plugins/plugins.ts +27 -16
  58. package/src/plugins/tree-sitter/editor.ts +369 -0
  59. package/src/plugins/tree-sitter/lang-packs/index.ts +23 -0
  60. package/src/plugins/tree-sitter/lang-packs/java.ts +59 -0
  61. package/src/plugins/tree-sitter/lang-packs/javascript.ts +57 -0
  62. package/src/plugins/tree-sitter/lang-packs/python.ts +45 -0
  63. package/src/plugins/tree-sitter/lang-packs/types.ts +79 -0
  64. package/src/plugins/tree-sitter/lang-packs/typescript.ts +49 -0
  65. package/src/plugins/tree-sitter/parser.ts +444 -0
  66. package/src/plugins/tree-sitter/simple-paths.ts +467 -0
  67. package/src/plugins/types.ts +11 -0
  68. package/src/plugins/url.ts +5 -3
  69. package/src/plugins/vim.ts +8 -5
  70. package/src/processors/CustomVariables.ts +60 -70
  71. package/src/processors/TokenCompressor.ts +15 -14
  72. package/src/processors/ToolResponseCache.ts +20 -14
  73. package/src/services/EmbeddingService.ts +18 -9
  74. package/src/services/EventService.ts +80 -0
  75. package/src/services/Mcp.ts +5 -0
  76. package/src/services/S3.ts +4 -3
  77. package/src/services/Tools.ts +125 -53
  78. package/src/services/index.ts +16 -11
  79. package/src/services/types.ts +3 -3
  80. package/src/types.ts +7 -2
  81. package/src/worker.ts +14 -1
  82. package/test-comprehensive.ts +31 -0
  83. package/tests/clients/AIClient.test.ts +490 -0
  84. package/tests/manual/agent-events/run-test.ts +203 -0
  85. package/tests/{integration → manual/file-edits}/figma.test.ts +1 -1
  86. package/tests/{integration → manual/file-edits}/fileblocks/readwrite.test.ts +7 -3
  87. package/tests/{integration → manual/file-edits}/patching.test.ts +11 -8
  88. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +332 -0
  89. package/tests/plugins/language/languagePlugin-integration.test.ts +456 -0
  90. package/tests/plugins/language/languagePlugin.test.ts +363 -0
  91. package/tests/processors/Base64ImageDetector.test.ts +403 -0
  92. package/tests/processors/CustomVariables.test.ts +485 -0
  93. package/tests/processors/HarmonyToolProcessor.test.ts +490 -0
  94. package/tests/processors/TokenCompressor.test.ts +390 -0
  95. package/tests/processors/ToolResponseCache.test.ts +736 -0
  96. package/tests/services/Tools.test.ts +1339 -0
  97. package/tests/test.spec.ts +162 -117
  98. package/tests/tree-sitter/editor.test.ts +113 -0
  99. package/tests/tree-sitter/invalid.test.ts +299 -0
  100. package/tests/tree-sitter/paths/common-edits.test.ts +564 -0
  101. package/tests/tree-sitter/paths/debug-exact-position.test.ts +44 -0
  102. package/tests/tree-sitter/paths/debug-line-indexing.test.ts +49 -0
  103. package/tests/tree-sitter/paths/debug-paths.test.ts +90 -0
  104. package/tests/tree-sitter/paths/paths.test.ts +170 -0
  105. package/tests/tree-sitter/paths/simple-paths.test.ts +367 -0
  106. package/tests/tree-sitter/sample-after.ts +48 -0
  107. package/tests/tree-sitter/sample-before.ts +25 -0
  108. package/tests/tree-sitter/test-files/completely-broken.ts +7 -0
  109. package/tests/tree-sitter/test-files/duplicate-braces.ts +39 -0
  110. package/tests/tree-sitter/test-files/invalid-nesting.ts +39 -0
  111. package/tests/tree-sitter/test-files/malformed-signature.ts +39 -0
  112. package/tests/tree-sitter/test-files/mismatched-parens.ts +39 -0
  113. package/tests/tree-sitter/test-files/missing-semicolon.ts +39 -0
  114. package/tests/tree-sitter/test-files/partially-broken.ts +20 -0
  115. package/tests/tree-sitter/test-files/specific-errors.ts +14 -0
  116. package/tests/tree-sitter/test-files/unclosed-string.ts +39 -0
  117. package/tests/tree-sitter/tree-sitter.test.ts +251 -0
  118. package/ts_build/package.json +8 -3
  119. package/ts_build/src/agents/base/base.d.ts +7 -2
  120. package/ts_build/src/agents/base/base.js +27 -21
  121. package/ts_build/src/agents/base/base.js.map +1 -1
  122. package/ts_build/src/agents/patcher/patcher.js +26 -5
  123. package/ts_build/src/agents/patcher/patcher.js.map +1 -1
  124. package/ts_build/src/agents/tools/agentCall.js +2 -1
  125. package/ts_build/src/agents/tools/agentCall.js.map +1 -1
  126. package/ts_build/src/agents/tools/aiClient.d.ts +7 -8
  127. package/ts_build/src/agents/tools/aiClient.js.map +1 -1
  128. package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -0
  129. package/ts_build/src/agents/tools/ast/astAppendNode.js +96 -0
  130. package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -0
  131. package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -0
  132. package/ts_build/src/agents/tools/ast/astDeleteNode.js +94 -0
  133. package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -0
  134. package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -0
  135. package/ts_build/src/agents/tools/ast/astEditNode.js +96 -0
  136. package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -0
  137. package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -0
  138. package/ts_build/src/agents/tools/ast/astGetPathForLine.js +78 -0
  139. package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -0
  140. package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -0
  141. package/ts_build/src/agents/tools/ast/astListPaths.js +78 -0
  142. package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -0
  143. package/ts_build/src/agents/tools/ast/index.d.ts +5 -0
  144. package/ts_build/src/agents/tools/ast/index.js +14 -0
  145. package/ts_build/src/agents/tools/ast/index.js.map +1 -0
  146. package/ts_build/src/agents/tools/astAppendNode.d.ts +1 -0
  147. package/ts_build/src/agents/tools/astAppendNode.js +98 -0
  148. package/ts_build/src/agents/tools/astAppendNode.js.map +1 -0
  149. package/ts_build/src/agents/tools/astDeleteNode.d.ts +1 -0
  150. package/ts_build/src/agents/tools/astDeleteNode.js +95 -0
  151. package/ts_build/src/agents/tools/astDeleteNode.js.map +1 -0
  152. package/ts_build/src/agents/tools/astEditNode.d.ts +1 -0
  153. package/ts_build/src/agents/tools/astEditNode.js +98 -0
  154. package/ts_build/src/agents/tools/astEditNode.js.map +1 -0
  155. package/ts_build/src/agents/tools/astGetPathForLine.d.ts +1 -0
  156. package/ts_build/src/agents/tools/astGetPathForLine.js +89 -0
  157. package/ts_build/src/agents/tools/astGetPathForLine.js.map +1 -0
  158. package/ts_build/src/agents/tools/astListPaths.d.ts +1 -0
  159. package/ts_build/src/agents/tools/astListPaths.js +82 -0
  160. package/ts_build/src/agents/tools/astListPaths.js.map +1 -0
  161. package/ts_build/src/agents/tools/callPlugin.js +4 -2
  162. package/ts_build/src/agents/tools/callPlugin.js.map +1 -1
  163. package/ts_build/src/agents/tools/embeddingSearch.js +3 -2
  164. package/ts_build/src/agents/tools/embeddingSearch.js.map +1 -1
  165. package/ts_build/src/agents/tools/execCommand.d.ts +2 -2
  166. package/ts_build/src/agents/tools/execCommand.js +201 -67
  167. package/ts_build/src/agents/tools/execCommand.js.map +1 -1
  168. package/ts_build/src/agents/tools/fileSearch.d.ts +1 -1
  169. package/ts_build/src/agents/tools/fileSearch.js +11 -15
  170. package/ts_build/src/agents/tools/fileSearch.js.map +1 -1
  171. package/ts_build/src/agents/tools/github/index.d.ts +1 -1
  172. package/ts_build/src/agents/tools/index.d.ts +1 -0
  173. package/ts_build/src/agents/tools/index.js +1 -0
  174. package/ts_build/src/agents/tools/index.js.map +1 -1
  175. package/ts_build/src/agents/tools/language/definitions.js +11 -2
  176. package/ts_build/src/agents/tools/language/definitions.js.map +1 -1
  177. package/ts_build/src/agents/tools/language/index.js +4 -3
  178. package/ts_build/src/agents/tools/language/index.js.map +1 -1
  179. package/ts_build/src/agents/tools/lintFile.js +4 -2
  180. package/ts_build/src/agents/tools/lintFile.js.map +1 -1
  181. package/ts_build/src/agents/tools/list.js +185 -49
  182. package/ts_build/src/agents/tools/list.js.map +1 -1
  183. package/ts_build/src/agents/tools/patch.js +33 -10
  184. package/ts_build/src/agents/tools/patch.js.map +1 -1
  185. package/ts_build/src/agents/tools/readBlocks.js +23 -0
  186. package/ts_build/src/agents/tools/readBlocks.js.map +1 -1
  187. package/ts_build/src/agents/tools/readFile.js +14 -0
  188. package/ts_build/src/agents/tools/readFile.js.map +1 -1
  189. package/ts_build/src/agents/tools/stringReplace.js +19 -2
  190. package/ts_build/src/agents/tools/stringReplace.js.map +1 -1
  191. package/ts_build/src/agents/tools/writeFile.js +40 -0
  192. package/ts_build/src/agents/tools/writeFile.js.map +1 -1
  193. package/ts_build/src/agents/tools/ycmd/server.js +5 -0
  194. package/ts_build/src/agents/tools/ycmd/server.js.map +1 -1
  195. package/ts_build/src/chat/CliChatService.d.ts +1 -0
  196. package/ts_build/src/chat/CliChatService.js +6 -2
  197. package/ts_build/src/chat/CliChatService.js.map +1 -1
  198. package/ts_build/src/chat/modules/AgentModule.d.ts +5 -1
  199. package/ts_build/src/chat/modules/AgentModule.js +62 -32
  200. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  201. package/ts_build/src/chat/modules/AskModule.js.map +1 -1
  202. package/ts_build/src/chat/modules/SetupModule.js +4 -3
  203. package/ts_build/src/chat/modules/SetupModule.js.map +1 -1
  204. package/ts_build/src/chat/modules/SystemModule.js +19 -4
  205. package/ts_build/src/chat/modules/SystemModule.js.map +1 -1
  206. package/ts_build/src/chat/modules/index.d.ts +5 -0
  207. package/ts_build/src/chat/modules/index.js +14 -0
  208. package/ts_build/src/chat/modules/index.js.map +1 -0
  209. package/ts_build/src/chat/types.d.ts +2 -0
  210. package/ts_build/src/chat-old.js +3 -3
  211. package/ts_build/src/chat-old.js.map +1 -1
  212. package/ts_build/src/clients/anthropic.d.ts +1 -0
  213. package/ts_build/src/clients/anthropic.js +22 -1
  214. package/ts_build/src/clients/anthropic.js.map +1 -1
  215. package/ts_build/src/clients/openai.js +1 -1
  216. package/ts_build/src/clients/openai.js.map +1 -1
  217. package/ts_build/src/clients/xai.d.ts +7 -0
  218. package/ts_build/src/clients/xai.js +13 -4
  219. package/ts_build/src/clients/xai.js.map +1 -1
  220. package/ts_build/src/config.js +14 -3
  221. package/ts_build/src/config.js.map +1 -1
  222. package/ts_build/src/dataset/diffs/generate.js +2 -2
  223. package/ts_build/src/dataset/diffs/generate.js.map +1 -1
  224. package/ts_build/src/dataset/diffs/jsonl.js.map +1 -1
  225. package/ts_build/src/embeddings.js +9 -13
  226. package/ts_build/src/embeddings.js.map +1 -1
  227. package/ts_build/src/index.js +10 -10
  228. package/ts_build/src/index.js.map +1 -1
  229. package/ts_build/src/plugins/GitPlugin.d.ts +39 -0
  230. package/ts_build/src/plugins/GitPlugin.js +439 -0
  231. package/ts_build/src/plugins/GitPlugin.js.map +1 -0
  232. package/ts_build/src/plugins/LinterPlugin.d.ts +15 -0
  233. package/ts_build/src/plugins/LinterPlugin.js +65 -0
  234. package/ts_build/src/plugins/LinterPlugin.js.map +1 -0
  235. package/ts_build/src/plugins/PluginBase.d.ts +4 -3
  236. package/ts_build/src/plugins/PluginBase.js +3 -3
  237. package/ts_build/src/plugins/PluginBase.js.map +1 -1
  238. package/ts_build/src/plugins/asana.d.ts +3 -1
  239. package/ts_build/src/plugins/asana.js +3 -2
  240. package/ts_build/src/plugins/asana.js.map +1 -1
  241. package/ts_build/src/plugins/downloader/plugin.d.ts +3 -1
  242. package/ts_build/src/plugins/downloader/plugin.js +3 -2
  243. package/ts_build/src/plugins/downloader/plugin.js.map +1 -1
  244. package/ts_build/src/plugins/embedding.d.ts +5 -1
  245. package/ts_build/src/plugins/embedding.js +15 -3
  246. package/ts_build/src/plugins/embedding.js.map +1 -1
  247. package/ts_build/src/plugins/figma.d.ts +3 -1
  248. package/ts_build/src/plugins/figma.js +28 -4
  249. package/ts_build/src/plugins/figma.js.map +1 -1
  250. package/ts_build/src/plugins/github.d.ts +3 -1
  251. package/ts_build/src/plugins/github.js +3 -2
  252. package/ts_build/src/plugins/github.js.map +1 -1
  253. package/ts_build/src/plugins/jira.d.ts +3 -1
  254. package/ts_build/src/plugins/jira.js +3 -2
  255. package/ts_build/src/plugins/jira.js.map +1 -1
  256. package/ts_build/src/plugins/language.d.ts +7 -4
  257. package/ts_build/src/plugins/language.js +85 -20
  258. package/ts_build/src/plugins/language.js.map +1 -1
  259. package/ts_build/src/plugins/linear.d.ts +3 -1
  260. package/ts_build/src/plugins/linear.js +3 -2
  261. package/ts_build/src/plugins/linear.js.map +1 -1
  262. package/ts_build/src/plugins/notion.d.ts +3 -1
  263. package/ts_build/src/plugins/notion.js +3 -2
  264. package/ts_build/src/plugins/notion.js.map +1 -1
  265. package/ts_build/src/plugins/plugins.d.ts +4 -3
  266. package/ts_build/src/plugins/plugins.js +24 -14
  267. package/ts_build/src/plugins/plugins.js.map +1 -1
  268. package/ts_build/src/plugins/tree-sitter/editor.d.ts +34 -0
  269. package/ts_build/src/plugins/tree-sitter/editor.js +218 -0
  270. package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -0
  271. package/ts_build/src/plugins/tree-sitter/human-readable-paths-new.d.ts +29 -0
  272. package/ts_build/src/plugins/tree-sitter/human-readable-paths-new.js +538 -0
  273. package/ts_build/src/plugins/tree-sitter/human-readable-paths-new.js.map +1 -0
  274. package/ts_build/src/plugins/tree-sitter/human-readable-paths.d.ts +22 -0
  275. package/ts_build/src/plugins/tree-sitter/human-readable-paths.js +332 -0
  276. package/ts_build/src/plugins/tree-sitter/human-readable-paths.js.map +1 -0
  277. package/ts_build/src/plugins/tree-sitter/lang-packs/index.d.ts +8 -0
  278. package/ts_build/src/plugins/tree-sitter/lang-packs/index.js +26 -0
  279. package/ts_build/src/plugins/tree-sitter/lang-packs/index.js.map +1 -0
  280. package/ts_build/src/plugins/tree-sitter/lang-packs/java.d.ts +2 -0
  281. package/ts_build/src/plugins/tree-sitter/lang-packs/java.js +61 -0
  282. package/ts_build/src/plugins/tree-sitter/lang-packs/java.js.map +1 -0
  283. package/ts_build/src/plugins/tree-sitter/lang-packs/javascript.d.ts +2 -0
  284. package/ts_build/src/plugins/tree-sitter/lang-packs/javascript.js +59 -0
  285. package/ts_build/src/plugins/tree-sitter/lang-packs/javascript.js.map +1 -0
  286. package/ts_build/src/plugins/tree-sitter/lang-packs/python.d.ts +2 -0
  287. package/ts_build/src/plugins/tree-sitter/lang-packs/python.js +47 -0
  288. package/ts_build/src/plugins/tree-sitter/lang-packs/python.js.map +1 -0
  289. package/ts_build/src/plugins/tree-sitter/lang-packs/types.d.ts +43 -0
  290. package/ts_build/src/plugins/tree-sitter/lang-packs/types.js +3 -0
  291. package/ts_build/src/plugins/tree-sitter/lang-packs/types.js.map +1 -0
  292. package/ts_build/src/plugins/tree-sitter/lang-packs/typescript.d.ts +2 -0
  293. package/ts_build/src/plugins/tree-sitter/lang-packs/typescript.js +50 -0
  294. package/ts_build/src/plugins/tree-sitter/lang-packs/typescript.js.map +1 -0
  295. package/ts_build/src/plugins/tree-sitter/parser.d.ts +75 -0
  296. package/ts_build/src/plugins/tree-sitter/parser.js +306 -0
  297. package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -0
  298. package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +22 -0
  299. package/ts_build/src/plugins/tree-sitter/simple-paths.js +332 -0
  300. package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -0
  301. package/ts_build/src/plugins/types.d.ts +10 -0
  302. package/ts_build/src/plugins/url.d.ts +3 -2
  303. package/ts_build/src/plugins/url.js +3 -2
  304. package/ts_build/src/plugins/url.js.map +1 -1
  305. package/ts_build/src/plugins/vim.d.ts +4 -2
  306. package/ts_build/src/plugins/vim.js +6 -8
  307. package/ts_build/src/plugins/vim.js.map +1 -1
  308. package/ts_build/src/processors/CustomVariables.js +45 -47
  309. package/ts_build/src/processors/CustomVariables.js.map +1 -1
  310. package/ts_build/src/processors/TokenCompressor.js +10 -13
  311. package/ts_build/src/processors/TokenCompressor.js.map +1 -1
  312. package/ts_build/src/processors/ToolResponseCache.d.ts +2 -2
  313. package/ts_build/src/processors/ToolResponseCache.js +18 -10
  314. package/ts_build/src/processors/ToolResponseCache.js.map +1 -1
  315. package/ts_build/src/services/EmbeddingService.d.ts +10 -1
  316. package/ts_build/src/services/EmbeddingService.js +12 -12
  317. package/ts_build/src/services/EmbeddingService.js.map +1 -1
  318. package/ts_build/src/services/EventService.d.ts +7 -0
  319. package/ts_build/src/services/EventService.js +49 -0
  320. package/ts_build/src/services/EventService.js.map +1 -1
  321. package/ts_build/src/services/Mcp.js +8 -0
  322. package/ts_build/src/services/Mcp.js.map +1 -1
  323. package/ts_build/src/services/S3.js +4 -3
  324. package/ts_build/src/services/S3.js.map +1 -1
  325. package/ts_build/src/services/Tools.d.ts +1 -0
  326. package/ts_build/src/services/Tools.js +97 -35
  327. package/ts_build/src/services/Tools.js.map +1 -1
  328. package/ts_build/src/services/index.d.ts +4 -5
  329. package/ts_build/src/services/index.js +14 -9
  330. package/ts_build/src/services/index.js.map +1 -1
  331. package/ts_build/src/services/types.js +3 -3
  332. package/ts_build/src/services/types.js.map +1 -1
  333. package/ts_build/src/types.d.ts +7 -1
  334. package/ts_build/src/types.js +4 -0
  335. package/ts_build/src/types.js.map +1 -1
  336. package/ts_build/src/worker.js +12 -1
  337. package/ts_build/src/worker.js.map +1 -1
  338. package/ts_build/tests/clients/AIClient.test.d.ts +1 -0
  339. package/ts_build/tests/clients/AIClient.test.js +377 -0
  340. package/ts_build/tests/clients/AIClient.test.js.map +1 -0
  341. package/ts_build/tests/languagePlugin.test.js +217 -11
  342. package/ts_build/tests/languagePlugin.test.js.map +1 -1
  343. package/ts_build/tests/manual/agent-events/event-handler-reliability.test.d.ts +1 -0
  344. package/ts_build/tests/manual/agent-events/event-handler-reliability.test.js +315 -0
  345. package/ts_build/tests/manual/agent-events/event-handler-reliability.test.js.map +1 -0
  346. package/ts_build/tests/manual/agent-events/run-test.d.ts +2 -0
  347. package/ts_build/tests/manual/agent-events/run-test.js +148 -0
  348. package/ts_build/tests/manual/agent-events/run-test.js.map +1 -0
  349. package/ts_build/tests/manual/file-edits/figma.test.d.ts +1 -0
  350. package/ts_build/tests/manual/file-edits/figma.test.js +47 -0
  351. package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -0
  352. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.d.ts +1 -0
  353. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js +100 -0
  354. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js.map +1 -0
  355. package/ts_build/tests/manual/file-edits/patching.test.d.ts +1 -0
  356. package/ts_build/tests/manual/file-edits/patching.test.js +119 -0
  357. package/ts_build/tests/manual/file-edits/patching.test.js.map +1 -0
  358. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.d.ts +1 -0
  359. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +277 -0
  360. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -0
  361. package/ts_build/tests/plugins/language/languagePlugin-integration.test.d.ts +1 -0
  362. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js +331 -0
  363. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js.map +1 -0
  364. package/ts_build/tests/plugins/language/languagePlugin.test.d.ts +1 -0
  365. package/ts_build/tests/plugins/language/languagePlugin.test.js +286 -0
  366. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -0
  367. package/ts_build/tests/processors/Base64ImageDetector.test.d.ts +1 -0
  368. package/ts_build/tests/processors/Base64ImageDetector.test.js +351 -0
  369. package/ts_build/tests/processors/Base64ImageDetector.test.js.map +1 -0
  370. package/ts_build/tests/processors/CustomVariables.test.d.ts +1 -0
  371. package/ts_build/tests/processors/CustomVariables.test.js +354 -0
  372. package/ts_build/tests/processors/CustomVariables.test.js.map +1 -0
  373. package/ts_build/tests/processors/HarmonyToolProcessor.test.d.ts +1 -0
  374. package/ts_build/tests/processors/HarmonyToolProcessor.test.js +382 -0
  375. package/ts_build/tests/processors/HarmonyToolProcessor.test.js.map +1 -0
  376. package/ts_build/tests/processors/TokenCompressor.test.d.ts +1 -0
  377. package/ts_build/tests/processors/TokenCompressor.test.js +299 -0
  378. package/ts_build/tests/processors/TokenCompressor.test.js.map +1 -0
  379. package/ts_build/tests/processors/ToolResponseCache.test.d.ts +1 -0
  380. package/ts_build/tests/processors/ToolResponseCache.test.js +550 -0
  381. package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -0
  382. package/ts_build/tests/services/Plugins/plugin-event-integration.test.d.ts +1 -0
  383. package/ts_build/tests/services/Plugins/plugin-event-integration.test.js +232 -0
  384. package/ts_build/tests/services/Plugins/plugin-event-integration.test.js.map +1 -0
  385. package/ts_build/tests/services/Tools.test.d.ts +1 -0
  386. package/ts_build/tests/services/Tools.test.js +1059 -0
  387. package/ts_build/tests/services/Tools.test.js.map +1 -0
  388. package/ts_build/tests/test.spec.js +110 -68
  389. package/ts_build/tests/test.spec.js.map +1 -1
  390. package/ts_build/tests/tree-sitter/editor.test.d.ts +1 -0
  391. package/ts_build/tests/tree-sitter/editor.test.js +85 -0
  392. package/ts_build/tests/tree-sitter/editor.test.js.map +1 -0
  393. package/ts_build/tests/tree-sitter/invalid.test.d.ts +1 -0
  394. package/ts_build/tests/tree-sitter/invalid.test.js +198 -0
  395. package/ts_build/tests/tree-sitter/invalid.test.js.map +1 -0
  396. package/ts_build/tests/tree-sitter/paths/common-edits.test.d.ts +1 -0
  397. package/ts_build/tests/tree-sitter/paths/common-edits.test.js +347 -0
  398. package/ts_build/tests/tree-sitter/paths/common-edits.test.js.map +1 -0
  399. package/ts_build/tests/tree-sitter/paths/debug-exact-position.test.d.ts +1 -0
  400. package/ts_build/tests/tree-sitter/paths/debug-exact-position.test.js +35 -0
  401. package/ts_build/tests/tree-sitter/paths/debug-exact-position.test.js.map +1 -0
  402. package/ts_build/tests/tree-sitter/paths/debug-line-indexing.test.d.ts +1 -0
  403. package/ts_build/tests/tree-sitter/paths/debug-line-indexing.test.js +38 -0
  404. package/ts_build/tests/tree-sitter/paths/debug-line-indexing.test.js.map +1 -0
  405. package/ts_build/tests/tree-sitter/paths/debug-paths.test.d.ts +1 -0
  406. package/ts_build/tests/tree-sitter/paths/debug-paths.test.js +74 -0
  407. package/ts_build/tests/tree-sitter/paths/debug-paths.test.js.map +1 -0
  408. package/ts_build/tests/tree-sitter/paths/human-readable-paths.test.d.ts +1 -0
  409. package/ts_build/tests/tree-sitter/paths/human-readable-paths.test.js +302 -0
  410. package/ts_build/tests/tree-sitter/paths/human-readable-paths.test.js.map +1 -0
  411. package/ts_build/tests/tree-sitter/paths/paths.test.d.ts +1 -0
  412. package/ts_build/tests/tree-sitter/paths/paths.test.js +116 -0
  413. package/ts_build/tests/tree-sitter/paths/paths.test.js.map +1 -0
  414. package/ts_build/tests/tree-sitter/paths/simple-paths.test.d.ts +1 -0
  415. package/ts_build/tests/tree-sitter/paths/simple-paths.test.js +302 -0
  416. package/ts_build/tests/tree-sitter/paths/simple-paths.test.js.map +1 -0
  417. package/ts_build/tests/tree-sitter/sample-after.d.ts +11 -0
  418. package/ts_build/tests/tree-sitter/sample-after.js +44 -0
  419. package/ts_build/tests/tree-sitter/sample-after.js.map +1 -0
  420. package/ts_build/tests/tree-sitter/sample-before.d.ts +9 -0
  421. package/ts_build/tests/tree-sitter/sample-before.js +28 -0
  422. package/ts_build/tests/tree-sitter/sample-before.js.map +1 -0
  423. package/ts_build/tests/tree-sitter/test-files/completely-broken.d.ts +2 -0
  424. package/ts_build/tests/tree-sitter/test-files/completely-broken.js +17 -0
  425. package/ts_build/tests/tree-sitter/test-files/completely-broken.js.map +1 -0
  426. package/ts_build/tests/tree-sitter/test-files/duplicate-braces.d.ts +8 -0
  427. package/ts_build/tests/tree-sitter/test-files/duplicate-braces.js +38 -0
  428. package/ts_build/tests/tree-sitter/test-files/duplicate-braces.js.map +1 -0
  429. package/ts_build/tests/tree-sitter/test-files/invalid-nesting.d.ts +8 -0
  430. package/ts_build/tests/tree-sitter/test-files/invalid-nesting.js +38 -0
  431. package/ts_build/tests/tree-sitter/test-files/invalid-nesting.js.map +1 -0
  432. package/ts_build/tests/tree-sitter/test-files/malformed-signature.d.ts +8 -0
  433. package/ts_build/tests/tree-sitter/test-files/malformed-signature.js +38 -0
  434. package/ts_build/tests/tree-sitter/test-files/malformed-signature.js.map +1 -0
  435. package/ts_build/tests/tree-sitter/test-files/mismatched-parens.d.ts +10 -0
  436. package/ts_build/tests/tree-sitter/test-files/mismatched-parens.js +38 -0
  437. package/ts_build/tests/tree-sitter/test-files/mismatched-parens.js.map +1 -0
  438. package/ts_build/tests/tree-sitter/test-files/missing-semicolon.d.ts +8 -0
  439. package/ts_build/tests/tree-sitter/test-files/missing-semicolon.js +38 -0
  440. package/ts_build/tests/tree-sitter/test-files/missing-semicolon.js.map +1 -0
  441. package/ts_build/tests/tree-sitter/test-files/partially-broken.d.ts +6 -0
  442. package/ts_build/tests/tree-sitter/test-files/partially-broken.js +20 -0
  443. package/ts_build/tests/tree-sitter/test-files/partially-broken.js.map +1 -0
  444. package/ts_build/tests/tree-sitter/test-files/specific-errors.d.ts +7 -0
  445. package/ts_build/tests/tree-sitter/test-files/specific-errors.js +14 -0
  446. package/ts_build/tests/tree-sitter/test-files/specific-errors.js.map +1 -0
  447. package/ts_build/tests/tree-sitter/test-files/unclosed-string.d.ts +8 -0
  448. package/ts_build/tests/tree-sitter/test-files/unclosed-string.js +38 -0
  449. package/ts_build/tests/tree-sitter/test-files/unclosed-string.js.map +1 -0
  450. package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +1 -0
  451. package/ts_build/tests/tree-sitter/tree-sitter.test.js +185 -0
  452. package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -0
  453. package/tsconfig.json +2 -1
  454. package/tests/languagePlugin.test.ts +0 -74
  455. /package/src/chat/modules/{index.js → index.ts} +0 -0
  456. /package/tests/{integration → manual/file-edits}/patching/input.txt +0 -0
  457. /package/tests/{integration → manual/file-edits}/patching/output.txt +0 -0
  458. /package/tests/{integration → manual/file-edits}/patching/patch.txt +0 -0
  459. /package/tests/{integration → manual/file-edits}/patching/unseen.txt +0 -0
@@ -7,22 +7,42 @@ import {
7
7
  } from "../embeddings";
8
8
 
9
9
  import { PluginBase, PluginMeta } from "./PluginBase";
10
+ import { embed as embedFunction } from "../index";
10
11
 
11
12
  export class EmbeddingPlugin extends PluginBase {
12
13
  static readonly meta: PluginMeta = {
13
14
  key: "embeddings",
14
15
  name: "Embedding Plugin",
15
- requires: []
16
+ requires: [],
16
17
  };
17
18
 
18
- constructor() {
19
- super(EmbeddingPlugin.meta);
19
+ meta = EmbeddingPlugin.meta;
20
+
21
+ constructor(context) {
22
+ super(context);
23
+
24
+ // Subscribe to file:post-edit events
25
+ this.context.Events.on("file:post-edit", this.handleFilePostEdit.bind(this));
20
26
  }
21
27
 
22
28
  async embed() {
23
29
  return [];
24
30
  }
25
31
 
32
+ /**
33
+ * Handle file:post-edit events by triggering embedding
34
+ * @param payload The event payload containing filePath
35
+ * @returns Status message about embedding operation
36
+ */
37
+ async handleFilePostEdit(payload: { filePath: string }): Promise<string> {
38
+ try {
39
+ await embedFunction();
40
+ return "Embedding completed successfully";
41
+ } catch (error) {
42
+ return `Embedding failed: ${error.message}`;
43
+ }
44
+ }
45
+
26
46
  async call(userPrompt: string): Promise<string> {
27
47
  const count = 7;
28
48
  const embeddings = await getConfiguredEmbeddings();
@@ -49,4 +69,4 @@ export class EmbeddingPlugin extends PluginBase {
49
69
  return `EMBEDDING PLUGIN: Our knowledgebase contains this information which can be used to answer the question:
50
70
  ${JSON.stringify(context)}`;
51
71
  }
52
- }
72
+ }
@@ -1,9 +1,9 @@
1
1
  import { Client } from "figma-js";
2
2
  import qs from "qs"; // Assumed to be installed
3
3
  import { PluginBase, PluginMeta } from "./PluginBase";
4
+ import { PluginContext } from "./types";
4
5
  import { Plugin } from "./types";
5
6
  import { MinimalEmbedding } from "../types";
6
- import { askGptVision } from "../ai";
7
7
 
8
8
  interface Node {}
9
9
 
@@ -41,8 +41,10 @@ export class FigmaPlugin extends PluginBase implements Plugin {
41
41
  requires: ["FIGMA_API_KEY"],
42
42
  };
43
43
 
44
- constructor() {
45
- super(FigmaPlugin.meta);
44
+ meta = FigmaPlugin.meta;
45
+
46
+ constructor(context: PluginContext = {}) {
47
+ super(context);
46
48
  if (!this.isEnabled()) return;
47
49
 
48
50
  this.figmaToken = process.env.FIGMA_API_KEY;
@@ -138,6 +140,8 @@ export class FigmaPlugin extends PluginBase implements Plugin {
138
140
  if (!data.images.hasOwnProperty(nodeId)) continue;
139
141
 
140
142
  const imageUrl = data.images[nodeId];
143
+ // Lazy import to break circular dependency
144
+ const { askGptVision } = await import("../ai");
141
145
  const imageDescription = await askGptVision(
142
146
  imageUrl,
143
147
  `Describe the image with relavant information for this user question: ${userPrompt}`
@@ -1,5 +1,6 @@
1
1
  import { Octokit } from "@octokit/rest";
2
2
  import { PluginBase, PluginMeta } from "./PluginBase";
3
+ import { PluginContext } from "./types";
3
4
  import { parseHunks, hunksToPatch } from "../agents/tools/patch";
4
5
  import { MinimalEmbedding } from "../types";
5
6
 
@@ -10,10 +11,11 @@ export class GitHubPlugin extends PluginBase {
10
11
  requires: ["GITHUB_TOKEN"],
11
12
  };
12
13
 
14
+ meta = GitHubPlugin.meta;
13
15
  octokit: Octokit;
14
16
 
15
- constructor() {
16
- super(GitHubPlugin.meta);
17
+ constructor(context: PluginContext) {
18
+ super(context);
17
19
 
18
20
  const key = process.env.GITHUB_TOKEN;
19
21
  if (key && this.isEnabled()) {
@@ -1,5 +1,6 @@
1
1
  import JiraClient from "jira-client";
2
2
  import { PluginBase, PluginMeta } from "./PluginBase";
3
+ import { PluginContext } from "./types";
3
4
  import { MinimalEmbedding } from "../types";
4
5
 
5
6
  export class JiraPlugin extends PluginBase {
@@ -9,10 +10,11 @@ export class JiraPlugin extends PluginBase {
9
10
  requires: ["JIRA_HOST", "JIRA_USER", "JIRA_PASSWORD"]
10
11
  };
11
12
 
13
+ meta = JiraPlugin.meta;
12
14
  jiraClient: JiraClient;
13
15
 
14
- constructor() {
15
- super(JiraPlugin.meta);
16
+ constructor(context: PluginContext) {
17
+ super(context);
16
18
 
17
19
  if (!this.isEnabled()) return;
18
20
  this.jiraClient = new JiraClient({
@@ -1,44 +1,67 @@
1
1
  import { readFile, fileExists, fileStat } from "../utils";
2
+ import { minimatch } from "minimatch";
3
+ import { EventService } from "../services/EventService";
2
4
  import { Language } from "../types";
3
5
  import { getConfig, getLanguageConfig } from "../config";
4
6
  import { PluginBase, PluginMeta } from "./PluginBase";
5
- import { Plugin } from "./types";
7
+ import { Plugin, PluginContext } from "./types";
6
8
  import { GitHubPlugin } from "./github";
7
9
  import { AsanaPlugin } from "./asana";
8
10
  import { JiraPlugin } from "./jira";
9
11
  import { LinearPlugin } from "./linear";
10
12
  import { PluginService } from "./plugins";
11
13
 
14
+ /**
15
+ * Language Plugin with event-driven context loading
16
+ */
12
17
  export class LanguagePlugin extends PluginBase implements Plugin {
13
18
  static readonly meta: PluginMeta = {
14
19
  key: "language",
15
20
  name: "Language Plugin",
16
- requires: []
21
+ requires: [],
17
22
  };
18
23
 
19
- constructor(private pluginService: PluginService) {
20
- super(LanguagePlugin.meta);
24
+ meta = LanguagePlugin.meta;
25
+ private eventService: EventService;
26
+
27
+ constructor(context: PluginContext) {
28
+ super(context);
29
+ this.eventService = context.Events;
30
+ this.setupEventHandlers();
21
31
  }
22
32
 
23
- async embed(userPrompt: string) {
24
- return [];
33
+ /**
34
+ * Register event handlers based on language configuration
35
+ */
36
+ private async setupEventHandlers() {
37
+ try {
38
+ const languageConfig = await getLanguageConfig();
39
+
40
+ // Collect all unique events from all language terms
41
+ const allEvents = new Set<string>();
42
+ Object.values(languageConfig).forEach((termConfig) => {
43
+ if (termConfig.events) {
44
+ termConfig.events.forEach((event) => allEvents.add(event));
45
+ }
46
+ });
47
+
48
+ // Register handlers for each event
49
+ allEvents.forEach((eventType) => {
50
+ this.eventService.on(eventType, async (eventData) => {
51
+ await this.handleFileEvent(eventType, eventData);
52
+ });
53
+ });
54
+ } catch (error) {
55
+ console.error("LANGUAGE PLUGIN: Error setting up event handlers:", error);
56
+ }
25
57
  }
26
58
 
27
- async call(userPrompt: string): Promise<string> {
28
- const config = await getConfig();
59
+ /**
60
+ * Resolve sources for given terms and return loaded contexts
61
+ */
62
+ private async resolveSources(matchingTerms: string[]): Promise<any[]> {
29
63
  const languageConfig = await getLanguageConfig();
30
- // Extract terms from the language configuration
31
- const terms = Object.keys(languageConfig);
32
-
33
- // Find all matching terms in the userPrompt
34
- const matchingTerms = terms.filter((term) =>
35
- term
36
- .split(",")
37
- .some((w) => userPrompt.toLowerCase().includes(w.toLowerCase()))
38
- );
39
- if (matchingTerms.length > 0) {
40
- console.log("LANGUAGE PLUGIN: Found matching terms", matchingTerms);
41
- }
64
+ const config = await getConfig();
42
65
 
43
66
  const sources = matchingTerms.flatMap(
44
67
  (term) => languageConfig[term].sources
@@ -60,7 +83,6 @@ export class LanguagePlugin extends PluginBase implements Plugin {
60
83
  return { filePath, content: `File ${filePath} does not exist` };
61
84
  }
62
85
  const content = (await readFile(filePath, "utf8")).toString();
63
- console.log("LANGUAGE PLUGIN: Read file", filePath);
64
86
  return { filePath, content };
65
87
  })
66
88
  );
@@ -73,7 +95,7 @@ export class LanguagePlugin extends PluginBase implements Plugin {
73
95
  .map((s) => s.data);
74
96
  contexts.push(...textContexts);
75
97
 
76
- const plugins = this.pluginService.listPlugins();
98
+ const plugins = this.context.Plugins.listPlugins();
77
99
  for (const plugin of plugins) {
78
100
  if (config.plugins.includes(plugin)) {
79
101
  const matchingSources = sources.filter((s) => s.kind === plugin);
@@ -85,13 +107,101 @@ export class LanguagePlugin extends PluginBase implements Plugin {
85
107
  .map((s) => s.data)
86
108
  .flat()
87
109
  .join("\n");
88
- console.log("LANGUAGE PLUGIN: Calling plugin", plugin, data);
89
- const pluginContext = await this.pluginService.call(plugin, data);
110
+ const pluginContext = await this.context.Plugins.call(plugin, data);
90
111
 
91
112
  contexts.push(...pluginContext);
92
113
  }
93
114
  }
94
115
 
116
+ return contexts;
117
+ }
118
+
119
+ /**
120
+ * Handle file operation events and emit agent messages when patterns match
121
+ */
122
+ private async handleFileEvent(eventType: string, eventData: any) {
123
+ try {
124
+ const languageConfig = await getLanguageConfig();
125
+ const filePath = eventData?.filePath || eventData?.path;
126
+ const fileContent = await readFile(filePath, "utf8");
127
+
128
+ if (!filePath) {
129
+ return;
130
+ }
131
+
132
+ // Find matching language terms based on file patterns
133
+ const matchingFileTerms = Object.entries(languageConfig)
134
+ .filter(([term, config]) => {
135
+ // Check if this event type is configured for this term
136
+ if (!config.events || !config.events.includes(eventType)) {
137
+ return false;
138
+ }
139
+
140
+ // Check if file path matches any of the term patterns
141
+ // Or if the file content includes any of the term patterns
142
+ const patterns = term.split(",").map((p) => p.trim());
143
+ const matches = patterns.some(
144
+ (pattern) =>
145
+ minimatch(filePath, pattern) ||
146
+ fileContent.toString().toLowerCase().includes(pattern.toLowerCase())
147
+ );
148
+ return matches;
149
+ })
150
+ .map(([term]) => term);
151
+
152
+ if (matchingFileTerms.length > 0) {
153
+ // Resolve sources for matching terms
154
+ const resolvedSources = await this.resolveSources(matchingFileTerms);
155
+
156
+ // Emit agent message event with resolved context
157
+ this.eventService.emit(
158
+ "agent:msg",
159
+ JSON.stringify({
160
+ type: "language_context_trigger",
161
+ filePath,
162
+ matchingTerms: matchingFileTerms,
163
+ eventType,
164
+ resolvedSources,
165
+ contextMessage: `LANGUAGE PLUGIN: File event ${eventType} on ${filePath} triggered contextual expansions for terms: ${matchingFileTerms.join(
166
+ ", "
167
+ )}.
168
+ Expanded context: ${JSON.stringify(resolvedSources)}
169
+ These terms are directly related to the file operation so be sure to contextualize your response to this information.`,
170
+ })
171
+ );
172
+ }
173
+ } catch (error) {
174
+ console.error("LANGUAGE PLUGIN: Error handling file event:", error);
175
+ }
176
+ }
177
+
178
+ async embed(userPrompt: string) {
179
+ return [];
180
+ }
181
+
182
+ async call(userPrompt: string) {
183
+ // Get language configuration
184
+ const languageConfig = await getLanguageConfig();
185
+ const terms = Object.keys(languageConfig);
186
+
187
+ // Find all matching terms in the userPrompt using glob patterns
188
+ const matchingTerms = terms.filter((term) =>
189
+ term.split(",").some((pattern) => {
190
+ const trimmedPattern = pattern.trim();
191
+ // Use minimatch for file patterns, fallback to string contains for non-glob patterns
192
+ return trimmedPattern.includes("*")
193
+ ? minimatch(userPrompt, trimmedPattern)
194
+ : userPrompt.toLowerCase().includes(trimmedPattern.toLowerCase());
195
+ })
196
+ );
197
+
198
+ if (matchingTerms.length === 0) {
199
+ return "LANGUAGE PLUGIN: No matching terms found";
200
+ }
201
+
202
+ // Use the extracted resolveSources method
203
+ const contexts = await this.resolveSources(matchingTerms);
204
+
95
205
  if (!matchingTerms || !matchingTerms.length) {
96
206
  return "LANGUAGE PLUGIN: No matching terms found";
97
207
  }
@@ -104,6 +214,3 @@ export class LanguagePlugin extends PluginBase implements Plugin {
104
214
  `;
105
215
  }
106
216
  }
107
-
108
- // Since this uses other plugins, it needs to be registered
109
- // Plugins.registerPlugin("language", new LanguagePlugin());
@@ -1,5 +1,6 @@
1
1
  import { LinearClient } from "@linear/sdk";
2
2
  import { PluginBase, PluginMeta } from "./PluginBase";
3
+ import { PluginContext } from "./types";
3
4
  import { MinimalEmbedding } from "../types";
4
5
 
5
6
  export class LinearPlugin extends PluginBase {
@@ -9,10 +10,11 @@ export class LinearPlugin extends PluginBase {
9
10
  requires: ["LINEAR_API_KEY"],
10
11
  };
11
12
 
13
+ meta = LinearPlugin.meta;
12
14
  linearClient: LinearClient;
13
15
 
14
- constructor() {
15
- super(LinearPlugin.meta);
16
+ constructor(context: PluginContext) {
17
+ super(context);
16
18
 
17
19
  if (!this.isEnabled()) return;
18
20
  this.linearClient = new LinearClient({
@@ -1,5 +1,6 @@
1
1
  import { Client } from "@notionhq/client";
2
2
  import { PluginBase, PluginMeta } from "./PluginBase";
3
+ import { PluginContext } from "./types";
3
4
  import { PageObjectResponse } from "@notionhq/client/build/src/api-endpoints";
4
5
  import { Embeddable, MinimalEmbedding } from "../types";
5
6
 
@@ -10,10 +11,11 @@ export class NotionPlugin extends PluginBase {
10
11
  requires: ["NOTION_TOKEN"]
11
12
  };
12
13
 
14
+ meta = NotionPlugin.meta;
13
15
  notionClient: Client;
14
16
 
15
- constructor() {
16
- super(NotionPlugin.meta);
17
+ constructor(context: PluginContext) {
18
+ super(context);
17
19
 
18
20
  if (!this.isEnabled()) return;
19
21
  this.notionClient = new Client({
@@ -1,6 +1,6 @@
1
- import glob from "glob";
2
- import { Plugin } from "./types";
1
+ import { Plugin, PluginContext } from "./types";
3
2
  import { VimPlugin } from "./vim";
3
+ import { LinterPlugin } from "./LinterPlugin";
4
4
  import { LanguagePlugin } from "./language";
5
5
  import { EmbeddingPlugin } from "./embedding";
6
6
  import { GitHubPlugin } from "./github";
@@ -11,23 +11,28 @@ import { NotionPlugin } from "./notion";
11
11
  import { DownloaderPlugin } from "./downloader/plugin";
12
12
  import { FigmaPlugin } from "./figma";
13
13
  import { UrlPlugin } from "./url";
14
+ import { GitPlugin } from "./GitPlugin";
14
15
 
15
16
  export class PluginService {
16
17
  private pluginMap = new Map<string, Plugin>();
17
18
 
18
- constructor() {
19
+ constructor(context: PluginContext) {
20
+ context.Plugins = this;
21
+
19
22
  // Register migrated PluginBase plugins
20
- this.pluginMap.set("embeddings", new EmbeddingPlugin());
21
- this.pluginMap.set("vim", new VimPlugin());
22
- this.pluginMap.set("github", new GitHubPlugin());
23
- this.pluginMap.set("asana", new AsanaPlugin());
24
- this.pluginMap.set("linear", new LinearPlugin());
25
- this.pluginMap.set("jira", new JiraPlugin());
26
- this.pluginMap.set("notion", new NotionPlugin());
27
- this.pluginMap.set("download", new DownloaderPlugin());
28
- this.pluginMap.set("figma", new FigmaPlugin());
29
- this.pluginMap.set("language", new LanguagePlugin(this));
30
- this.pluginMap.set("url", new UrlPlugin());
23
+ this.pluginMap.set("embeddings", new EmbeddingPlugin(context));
24
+ this.pluginMap.set("vim", new VimPlugin(context));
25
+ this.pluginMap.set("linter", new LinterPlugin(context));
26
+ this.pluginMap.set("github", new GitHubPlugin(context));
27
+ this.pluginMap.set("asana", new AsanaPlugin(context));
28
+ this.pluginMap.set("linear", new LinearPlugin(context));
29
+ this.pluginMap.set("jira", new JiraPlugin(context));
30
+ this.pluginMap.set("notion", new NotionPlugin(context));
31
+ this.pluginMap.set("download", new DownloaderPlugin(context));
32
+ this.pluginMap.set("figma", new FigmaPlugin(context));
33
+ this.pluginMap.set("language", new LanguagePlugin(context));
34
+ this.pluginMap.set("url", new UrlPlugin(context));
35
+ this.pluginMap.set("git", new GitPlugin(context));
31
36
 
32
37
  // Keep legacy plugins for backward compatibility
33
38
  // These will be removed once all consumers are updated
@@ -78,6 +83,14 @@ export class PluginService {
78
83
  this.pluginMap.set(name, plugin);
79
84
  }
80
85
 
86
+ getPlugin(name: string): Plugin | undefined {
87
+ return this.pluginMap.get(name);
88
+ }
89
+
90
+ getPlugins(): Plugin[] {
91
+ return Array.from(this.pluginMap.values());
92
+ }
93
+
81
94
  async callMany(plugins: string[], userInput?: string) {
82
95
  if (!plugins || plugins.length === 0) {
83
96
  return "";
@@ -121,5 +134,3 @@ export class PluginService {
121
134
  return newPlugin.embed ? newPlugin.embed(userInput) : [];
122
135
  }
123
136
  }
124
-
125
- export const Plugins = new PluginService();