@tyvm/knowhow 0.0.1

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 (492) hide show
  1. package/.vscode/launch.json +14 -0
  2. package/CONFIG.md +336 -0
  3. package/README.md +49 -0
  4. package/autodoc/chat.mdx +20 -0
  5. package/autodoc/cli.mdx +11 -0
  6. package/autodoc/plugins/asana.mdx +47 -0
  7. package/autodoc/plugins/downloader/downloader.mdx +38 -0
  8. package/autodoc/plugins/downloader/plugin.mdx +37 -0
  9. package/autodoc/plugins/downloader/types.mdx +42 -0
  10. package/autodoc/plugins/embedding.mdx +41 -0
  11. package/autodoc/plugins/figma.mdx +45 -0
  12. package/autodoc/plugins/github.mdx +40 -0
  13. package/autodoc/plugins/jira.mdx +46 -0
  14. package/autodoc/plugins/language.mdx +37 -0
  15. package/autodoc/plugins/linear.mdx +35 -0
  16. package/autodoc/plugins/notion.mdx +38 -0
  17. package/autodoc/plugins/plugins.mdx +59 -0
  18. package/autodoc/plugins/types.mdx +51 -0
  19. package/autodoc/plugins/vim.mdx +39 -0
  20. package/autodoc/tools/addInternalTools.mdx +1 -0
  21. package/autodoc/tools/agentCall.mdx +1 -0
  22. package/autodoc/tools/asana/definitions.mdx +10 -0
  23. package/autodoc/tools/asana/index.mdx +12 -0
  24. package/autodoc/tools/askHuman.mdx +1 -0
  25. package/autodoc/tools/callPlugin.mdx +1 -0
  26. package/autodoc/tools/embeddingSearch.mdx +1 -0
  27. package/autodoc/tools/execCommand.mdx +1 -0
  28. package/autodoc/tools/fileSearch.mdx +1 -0
  29. package/autodoc/tools/finalAnswer.mdx +1 -0
  30. package/autodoc/tools/github/definitions.mdx +6 -0
  31. package/autodoc/tools/github/index.mdx +8 -0
  32. package/autodoc/tools/index.mdx +14 -0
  33. package/autodoc/tools/lintFile.mdx +7 -0
  34. package/autodoc/tools/list.mdx +16 -0
  35. package/autodoc/tools/modifyFile.mdx +7 -0
  36. package/autodoc/tools/patch.mdx +9 -0
  37. package/autodoc/tools/readBlocks.mdx +1 -0
  38. package/autodoc/tools/readFile.mdx +1 -0
  39. package/autodoc/tools/scanFile.mdx +1 -0
  40. package/autodoc/tools/textSearch.mdx +6 -0
  41. package/autodoc/tools/types/fileblock.mdx +1 -0
  42. package/autodoc/tools/visionTool.mdx +1 -0
  43. package/autodoc/tools/writeFile.mdx +1 -0
  44. package/jest.config.js +18 -0
  45. package/package.json +89 -0
  46. package/src/agents/base/base.ts +619 -0
  47. package/src/agents/base/prompt.ts +26 -0
  48. package/src/agents/configurable/ConfigAgent.ts +23 -0
  49. package/src/agents/developer/developer.ts +69 -0
  50. package/src/agents/index.ts +8 -0
  51. package/src/agents/interface.ts +11 -0
  52. package/src/agents/patcher/codebase.md +27 -0
  53. package/src/agents/patcher/patcher.ts +110 -0
  54. package/src/agents/researcher/researcher.ts +109 -0
  55. package/src/agents/tools/addInternalTools.ts +21 -0
  56. package/src/agents/tools/agentCall.ts +18 -0
  57. package/src/agents/tools/aiClient.ts +36 -0
  58. package/src/agents/tools/asana/definitions.ts +199 -0
  59. package/src/agents/tools/asana/index.ts +108 -0
  60. package/src/agents/tools/askHuman.ts +8 -0
  61. package/src/agents/tools/callPlugin.ts +4 -0
  62. package/src/agents/tools/embeddingSearch.ts +5 -0
  63. package/src/agents/tools/execCommand.ts +26 -0
  64. package/src/agents/tools/fileSearch.ts +33 -0
  65. package/src/agents/tools/finalAnswer.ts +4 -0
  66. package/src/agents/tools/github/definitions.ts +89 -0
  67. package/src/agents/tools/github/index.ts +67 -0
  68. package/src/agents/tools/googleSearch.ts +242 -0
  69. package/src/agents/tools/index.ts +24 -0
  70. package/src/agents/tools/language/definitions.ts +97 -0
  71. package/src/agents/tools/language/index.ts +19 -0
  72. package/src/agents/tools/lintFile.ts +17 -0
  73. package/src/agents/tools/list.ts +514 -0
  74. package/src/agents/tools/loadWebpage.ts +129 -0
  75. package/src/agents/tools/modifyFile.ts +53 -0
  76. package/src/agents/tools/patch.ts +672 -0
  77. package/src/agents/tools/readBlocks.ts +41 -0
  78. package/src/agents/tools/readFile.ts +39 -0
  79. package/src/agents/tools/scanFile.ts +16 -0
  80. package/src/agents/tools/textSearch.ts +21 -0
  81. package/src/agents/tools/types/fileblock.ts +5 -0
  82. package/src/agents/tools/visionTool.ts +5 -0
  83. package/src/agents/tools/writeFile.ts +46 -0
  84. package/src/agents/vim/vim.ts +153 -0
  85. package/src/ai.ts +167 -0
  86. package/src/chat.ts +412 -0
  87. package/src/cli.ts +85 -0
  88. package/src/clients/anthropic.ts +399 -0
  89. package/src/clients/gemini.ts +486 -0
  90. package/src/clients/http.ts +107 -0
  91. package/src/clients/index.ts +183 -0
  92. package/src/clients/knowhow.ts +33 -0
  93. package/src/clients/openai.ts +253 -0
  94. package/src/clients/types.ts +91 -0
  95. package/src/clients/xai.ts +132 -0
  96. package/src/config.ts +211 -0
  97. package/src/conversion.ts +140 -0
  98. package/src/dataset/diffs/README.md +12 -0
  99. package/src/dataset/diffs/debug-errors.ts +29 -0
  100. package/src/dataset/diffs/debug.ts +64 -0
  101. package/src/dataset/diffs/generate.ts +71 -0
  102. package/src/dataset/diffs/jsonl.ts +54 -0
  103. package/src/dataset/diffs/test.ts +193 -0
  104. package/src/embeddings.ts +411 -0
  105. package/src/hashes.ts +67 -0
  106. package/src/index.ts +376 -0
  107. package/src/login.ts +78 -0
  108. package/src/microphone.ts +136 -0
  109. package/src/modules/index.ts +37 -0
  110. package/src/modules/types.ts +48 -0
  111. package/src/plugins/asana.ts +134 -0
  112. package/src/plugins/downloader/downloader.ts +204 -0
  113. package/src/plugins/downloader/plugin.ts +85 -0
  114. package/src/plugins/downloader/types.ts +85 -0
  115. package/src/plugins/embedding.ts +42 -0
  116. package/src/plugins/figma.ts +137 -0
  117. package/src/plugins/github.ts +153 -0
  118. package/src/plugins/jira.ts +104 -0
  119. package/src/plugins/language.ts +100 -0
  120. package/src/plugins/linear.ts +219 -0
  121. package/src/plugins/notion.ts +170 -0
  122. package/src/plugins/plugins.ts +56 -0
  123. package/src/plugins/types.ts +5 -0
  124. package/src/plugins/url.ts +63 -0
  125. package/src/plugins/vim.ts +73 -0
  126. package/src/prompts/BasicCodeDocumenter.ts +1 -0
  127. package/src/prompts/BasicProjectDocumenter.ts +1 -0
  128. package/src/prompts/EmbeddingSeachHelper.ts +1 -0
  129. package/src/prompts/index.ts +9 -0
  130. package/src/server/index.ts +14 -0
  131. package/src/services/AgentService.ts +98 -0
  132. package/src/services/EmbeddingService.ts +410 -0
  133. package/src/services/EventService.ts +20 -0
  134. package/src/services/GitHub.ts +60 -0
  135. package/src/services/KnowhowClient.ts +113 -0
  136. package/src/services/Mcp.ts +270 -0
  137. package/src/services/McpServer.ts +119 -0
  138. package/src/services/McpWebsocketTransport.ts +64 -0
  139. package/src/services/S3.ts +126 -0
  140. package/src/services/Tools.ts +65 -0
  141. package/src/services/flags.ts +52 -0
  142. package/src/services/index.ts +8 -0
  143. package/src/types.ts +225 -0
  144. package/src/utils/index.ts +108 -0
  145. package/src/worker.ts +80 -0
  146. package/tests/integration/figma.test.ts +70 -0
  147. package/tests/integration/fileblocks/readwrite.test.ts +95 -0
  148. package/tests/integration/patching/input.txt +145 -0
  149. package/tests/integration/patching/output.txt +145 -0
  150. package/tests/integration/patching/patch.txt +15 -0
  151. package/tests/integration/patching/unseen.txt +80 -0
  152. package/tests/integration/patching.test.ts +136 -0
  153. package/tests/languagePlugin.test.ts +74 -0
  154. package/tests/patching/corrupted.test.ts +78 -0
  155. package/tests/patching/imports.patch.txt +11 -0
  156. package/tests/patching/imports.test.ts +43 -0
  157. package/tests/patching/imports.txt +11 -0
  158. package/tests/patching/interface.patch.txt +15 -0
  159. package/tests/patching/interface.txt +7 -0
  160. package/tests/test.spec.ts +132 -0
  161. package/ts_build/src/agents/base/base.d.ts +88 -0
  162. package/ts_build/src/agents/base/base.js +464 -0
  163. package/ts_build/src/agents/base/base.js.map +1 -0
  164. package/ts_build/src/agents/base/prompt.d.ts +1 -0
  165. package/ts_build/src/agents/base/prompt.js +30 -0
  166. package/ts_build/src/agents/base/prompt.js.map +1 -0
  167. package/ts_build/src/agents/configurable/ConfigAgent.d.ts +10 -0
  168. package/ts_build/src/agents/configurable/ConfigAgent.js +25 -0
  169. package/ts_build/src/agents/configurable/ConfigAgent.js.map +1 -0
  170. package/ts_build/src/agents/configurable/OpenAIAgent.d.ts +0 -0
  171. package/ts_build/src/agents/configurable/OpenAIAgent.js +1 -0
  172. package/ts_build/src/agents/configurable/OpenAIAgent.js.map +1 -0
  173. package/ts_build/src/agents/developer/developer.d.ts +9 -0
  174. package/ts_build/src/agents/developer/developer.js +69 -0
  175. package/ts_build/src/agents/developer/developer.js.map +1 -0
  176. package/ts_build/src/agents/index.d.ts +7 -0
  177. package/ts_build/src/agents/index.js +38 -0
  178. package/ts_build/src/agents/index.js.map +1 -0
  179. package/ts_build/src/agents/interface.d.ts +10 -0
  180. package/ts_build/src/agents/interface.js +3 -0
  181. package/ts_build/src/agents/interface.js.map +1 -0
  182. package/ts_build/src/agents/patcher/patcher.d.ts +9 -0
  183. package/ts_build/src/agents/patcher/patcher.js +106 -0
  184. package/ts_build/src/agents/patcher/patcher.js.map +1 -0
  185. package/ts_build/src/agents/researcher/researcher.d.ts +9 -0
  186. package/ts_build/src/agents/researcher/researcher.js +107 -0
  187. package/ts_build/src/agents/researcher/researcher.js.map +1 -0
  188. package/ts_build/src/agents/tools/addInternalTools.d.ts +5 -0
  189. package/ts_build/src/agents/tools/addInternalTools.js +18 -0
  190. package/ts_build/src/agents/tools/addInternalTools.js.map +1 -0
  191. package/ts_build/src/agents/tools/agentCall.d.ts +1 -0
  192. package/ts_build/src/agents/tools/agentCall.js +21 -0
  193. package/ts_build/src/agents/tools/agentCall.js.map +1 -0
  194. package/ts_build/src/agents/tools/aiClient.d.ts +6 -0
  195. package/ts_build/src/agents/tools/aiClient.js +25 -0
  196. package/ts_build/src/agents/tools/aiClient.js.map +1 -0
  197. package/ts_build/src/agents/tools/asana/definitions.d.ts +202 -0
  198. package/ts_build/src/agents/tools/asana/definitions.js +197 -0
  199. package/ts_build/src/agents/tools/asana/definitions.js.map +1 -0
  200. package/ts_build/src/agents/tools/asana/index.d.ts +8 -0
  201. package/ts_build/src/agents/tools/asana/index.js +98 -0
  202. package/ts_build/src/agents/tools/asana/index.js.map +1 -0
  203. package/ts_build/src/agents/tools/askHuman.d.ts +1 -0
  204. package/ts_build/src/agents/tools/askHuman.js +15 -0
  205. package/ts_build/src/agents/tools/askHuman.js.map +1 -0
  206. package/ts_build/src/agents/tools/callPlugin.d.ts +1 -0
  207. package/ts_build/src/agents/tools/callPlugin.js +9 -0
  208. package/ts_build/src/agents/tools/callPlugin.js.map +1 -0
  209. package/ts_build/src/agents/tools/client.d.ts +5 -0
  210. package/ts_build/src/agents/tools/client.js +21 -0
  211. package/ts_build/src/agents/tools/client.js.map +1 -0
  212. package/ts_build/src/agents/tools/embeddingSearch.d.ts +1 -0
  213. package/ts_build/src/agents/tools/embeddingSearch.js +9 -0
  214. package/ts_build/src/agents/tools/embeddingSearch.js.map +1 -0
  215. package/ts_build/src/agents/tools/execCommand.d.ts +1 -0
  216. package/ts_build/src/agents/tools/execCommand.js +25 -0
  217. package/ts_build/src/agents/tools/execCommand.js.map +1 -0
  218. package/ts_build/src/agents/tools/fileSearch.d.ts +1 -0
  219. package/ts_build/src/agents/tools/fileSearch.js +31 -0
  220. package/ts_build/src/agents/tools/fileSearch.js.map +1 -0
  221. package/ts_build/src/agents/tools/finalAnswer.d.ts +1 -0
  222. package/ts_build/src/agents/tools/finalAnswer.js +8 -0
  223. package/ts_build/src/agents/tools/finalAnswer.js.map +1 -0
  224. package/ts_build/src/agents/tools/github/definitions.d.ts +47 -0
  225. package/ts_build/src/agents/tools/github/definitions.js +86 -0
  226. package/ts_build/src/agents/tools/github/definitions.js.map +1 -0
  227. package/ts_build/src/agents/tools/github/index.d.ts +789 -0
  228. package/ts_build/src/agents/tools/github/index.js +56 -0
  229. package/ts_build/src/agents/tools/github/index.js.map +1 -0
  230. package/ts_build/src/agents/tools/googleSearch.d.ts +93 -0
  231. package/ts_build/src/agents/tools/googleSearch.js +117 -0
  232. package/ts_build/src/agents/tools/googleSearch.js.map +1 -0
  233. package/ts_build/src/agents/tools/googleSearchTypes.d.ts +74 -0
  234. package/ts_build/src/agents/tools/googleSearchTypes.js +3 -0
  235. package/ts_build/src/agents/tools/googleSearchTypes.js.map +1 -0
  236. package/ts_build/src/agents/tools/index.d.ts +24 -0
  237. package/ts_build/src/agents/tools/index.js +41 -0
  238. package/ts_build/src/agents/tools/index.js.map +1 -0
  239. package/ts_build/src/agents/tools/language/definitions.d.ts +89 -0
  240. package/ts_build/src/agents/tools/language/definitions.js +95 -0
  241. package/ts_build/src/agents/tools/language/definitions.js.map +1 -0
  242. package/ts_build/src/agents/tools/language/index.d.ts +4 -0
  243. package/ts_build/src/agents/tools/language/index.js +22 -0
  244. package/ts_build/src/agents/tools/language/index.js.map +1 -0
  245. package/ts_build/src/agents/tools/lintFile.d.ts +1 -0
  246. package/ts_build/src/agents/tools/lintFile.js +22 -0
  247. package/ts_build/src/agents/tools/lintFile.js.map +1 -0
  248. package/ts_build/src/agents/tools/list.d.ts +2 -0
  249. package/ts_build/src/agents/tools/list.js +505 -0
  250. package/ts_build/src/agents/tools/list.js.map +1 -0
  251. package/ts_build/src/agents/tools/loadWebpage.d.ts +8 -0
  252. package/ts_build/src/agents/tools/loadWebpage.js +97 -0
  253. package/ts_build/src/agents/tools/loadWebpage.js.map +1 -0
  254. package/ts_build/src/agents/tools/modifyFile.d.ts +2 -0
  255. package/ts_build/src/agents/tools/modifyFile.js +74 -0
  256. package/ts_build/src/agents/tools/modifyFile.js.map +1 -0
  257. package/ts_build/src/agents/tools/patch.d.ts +21 -0
  258. package/ts_build/src/agents/tools/patch.js +443 -0
  259. package/ts_build/src/agents/tools/patch.js.map +1 -0
  260. package/ts_build/src/agents/tools/readBlocks.d.ts +2 -0
  261. package/ts_build/src/agents/tools/readBlocks.js +59 -0
  262. package/ts_build/src/agents/tools/readBlocks.js.map +1 -0
  263. package/ts_build/src/agents/tools/readFile.d.ts +1 -0
  264. package/ts_build/src/agents/tools/readFile.js +46 -0
  265. package/ts_build/src/agents/tools/readFile.js.map +1 -0
  266. package/ts_build/src/agents/tools/scanFile.d.ts +1 -0
  267. package/ts_build/src/agents/tools/scanFile.js +36 -0
  268. package/ts_build/src/agents/tools/scanFile.js.map +1 -0
  269. package/ts_build/src/agents/tools/textSearch.d.ts +1 -0
  270. package/ts_build/src/agents/tools/textSearch.js +22 -0
  271. package/ts_build/src/agents/tools/textSearch.js.map +1 -0
  272. package/ts_build/src/agents/tools/types/fileblock.d.ts +5 -0
  273. package/ts_build/src/agents/tools/types/fileblock.js +3 -0
  274. package/ts_build/src/agents/tools/types/fileblock.js.map +1 -0
  275. package/ts_build/src/agents/tools/visionTool.d.ts +1 -0
  276. package/ts_build/src/agents/tools/visionTool.js +9 -0
  277. package/ts_build/src/agents/tools/visionTool.js.map +1 -0
  278. package/ts_build/src/agents/tools/writeFile.d.ts +2 -0
  279. package/ts_build/src/agents/tools/writeFile.js +61 -0
  280. package/ts_build/src/agents/tools/writeFile.js.map +1 -0
  281. package/ts_build/src/agents/vim/vim.d.ts +14 -0
  282. package/ts_build/src/agents/vim/vim.js +171 -0
  283. package/ts_build/src/agents/vim/vim.js.map +1 -0
  284. package/ts_build/src/ai.d.ts +10 -0
  285. package/ts_build/src/ai.js +102 -0
  286. package/ts_build/src/ai.js.map +1 -0
  287. package/ts_build/src/chat.d.ts +13 -0
  288. package/ts_build/src/chat.js +319 -0
  289. package/ts_build/src/chat.js.map +1 -0
  290. package/ts_build/src/cli.d.ts +2 -0
  291. package/ts_build/src/cli.js +98 -0
  292. package/ts_build/src/cli.js.map +1 -0
  293. package/ts_build/src/clients/anthropic.d.ts +31 -0
  294. package/ts_build/src/clients/anthropic.js +344 -0
  295. package/ts_build/src/clients/anthropic.js.map +1 -0
  296. package/ts_build/src/clients/gemini.d.ts +20 -0
  297. package/ts_build/src/clients/gemini.js +347 -0
  298. package/ts_build/src/clients/gemini.js.map +1 -0
  299. package/ts_build/src/clients/http.d.ts +12 -0
  300. package/ts_build/src/clients/http.js +91 -0
  301. package/ts_build/src/clients/http.js.map +1 -0
  302. package/ts_build/src/clients/index.d.ts +47 -0
  303. package/ts_build/src/clients/index.js +143 -0
  304. package/ts_build/src/clients/index.js.map +1 -0
  305. package/ts_build/src/clients/knowhow.d.ts +10 -0
  306. package/ts_build/src/clients/knowhow.js +24 -0
  307. package/ts_build/src/clients/knowhow.js.map +1 -0
  308. package/ts_build/src/clients/openai.d.ts +20 -0
  309. package/ts_build/src/clients/openai.js +221 -0
  310. package/ts_build/src/clients/openai.js.map +1 -0
  311. package/ts_build/src/clients/types.d.ts +89 -0
  312. package/ts_build/src/clients/types.js +3 -0
  313. package/ts_build/src/clients/types.js.map +1 -0
  314. package/ts_build/src/clients/xai.d.ts +22 -0
  315. package/ts_build/src/clients/xai.js +108 -0
  316. package/ts_build/src/clients/xai.js.map +1 -0
  317. package/ts_build/src/config.d.ts +9 -0
  318. package/ts_build/src/config.js +216 -0
  319. package/ts_build/src/config.js.map +1 -0
  320. package/ts_build/src/conversion.d.ts +7 -0
  321. package/ts_build/src/conversion.js +114 -0
  322. package/ts_build/src/conversion.js.map +1 -0
  323. package/ts_build/src/dataset/diffs/debug-errors.d.ts +1 -0
  324. package/ts_build/src/dataset/diffs/debug-errors.js +28 -0
  325. package/ts_build/src/dataset/diffs/debug-errors.js.map +1 -0
  326. package/ts_build/src/dataset/diffs/debug.d.ts +1 -0
  327. package/ts_build/src/dataset/diffs/debug.js +50 -0
  328. package/ts_build/src/dataset/diffs/debug.js.map +1 -0
  329. package/ts_build/src/dataset/diffs/generate.d.ts +1 -0
  330. package/ts_build/src/dataset/diffs/generate.js +70 -0
  331. package/ts_build/src/dataset/diffs/generate.js.map +1 -0
  332. package/ts_build/src/dataset/diffs/jsonl.d.ts +1 -0
  333. package/ts_build/src/dataset/diffs/jsonl.js +47 -0
  334. package/ts_build/src/dataset/diffs/jsonl.js.map +1 -0
  335. package/ts_build/src/dataset/diffs/test.d.ts +1 -0
  336. package/ts_build/src/dataset/diffs/test.js +114 -0
  337. package/ts_build/src/dataset/diffs/test.js.map +1 -0
  338. package/ts_build/src/embeddings.d.ts +19 -0
  339. package/ts_build/src/embeddings.js +322 -0
  340. package/ts_build/src/embeddings.js.map +1 -0
  341. package/ts_build/src/hashes.d.ts +6 -0
  342. package/ts_build/src/hashes.js +78 -0
  343. package/ts_build/src/hashes.js.map +1 -0
  344. package/ts_build/src/index.d.ts +14 -0
  345. package/ts_build/src/index.js +258 -0
  346. package/ts_build/src/index.js.map +1 -0
  347. package/ts_build/src/login.d.ts +2 -0
  348. package/ts_build/src/login.js +63 -0
  349. package/ts_build/src/login.js.map +1 -0
  350. package/ts_build/src/microphone.d.ts +9 -0
  351. package/ts_build/src/microphone.js +131 -0
  352. package/ts_build/src/microphone.js.map +1 -0
  353. package/ts_build/src/modules/index.d.ts +3 -0
  354. package/ts_build/src/modules/index.js +34 -0
  355. package/ts_build/src/modules/index.js.map +1 -0
  356. package/ts_build/src/modules/types.d.ts +37 -0
  357. package/ts_build/src/modules/types.js +3 -0
  358. package/ts_build/src/modules/types.js.map +1 -0
  359. package/ts_build/src/plugins/asana.d.ts +16 -0
  360. package/ts_build/src/plugins/asana.js +114 -0
  361. package/ts_build/src/plugins/asana.js.map +1 -0
  362. package/ts_build/src/plugins/downloader/downloader.d.ts +12 -0
  363. package/ts_build/src/plugins/downloader/downloader.js +174 -0
  364. package/ts_build/src/plugins/downloader/downloader.js.map +1 -0
  365. package/ts_build/src/plugins/downloader/index.d.ts +3 -0
  366. package/ts_build/src/plugins/downloader/index.js +41 -0
  367. package/ts_build/src/plugins/downloader/index.js.map +1 -0
  368. package/ts_build/src/plugins/downloader/plugin.d.ts +8 -0
  369. package/ts_build/src/plugins/downloader/plugin.js +83 -0
  370. package/ts_build/src/plugins/downloader/plugin.js.map +1 -0
  371. package/ts_build/src/plugins/downloader/types.d.ts +82 -0
  372. package/ts_build/src/plugins/downloader/types.js +79 -0
  373. package/ts_build/src/plugins/downloader/types.js.map +1 -0
  374. package/ts_build/src/plugins/embedding.d.ts +5 -0
  375. package/ts_build/src/plugins/embedding.js +28 -0
  376. package/ts_build/src/plugins/embedding.js.map +1 -0
  377. package/ts_build/src/plugins/figma.d.ts +20 -0
  378. package/ts_build/src/plugins/figma.js +94 -0
  379. package/ts_build/src/plugins/figma.js.map +1 -0
  380. package/ts_build/src/plugins/github.d.ts +1223 -0
  381. package/ts_build/src/plugins/github.js +115 -0
  382. package/ts_build/src/plugins/github.js.map +1 -0
  383. package/ts_build/src/plugins/jira.d.ts +15 -0
  384. package/ts_build/src/plugins/jira.js +94 -0
  385. package/ts_build/src/plugins/jira.js.map +1 -0
  386. package/ts_build/src/plugins/language.d.ts +8 -0
  387. package/ts_build/src/plugins/language.js +69 -0
  388. package/ts_build/src/plugins/language.js.map +1 -0
  389. package/ts_build/src/plugins/linear.d.ts +23 -0
  390. package/ts_build/src/plugins/linear.js +184 -0
  391. package/ts_build/src/plugins/linear.js.map +1 -0
  392. package/ts_build/src/plugins/notion.d.ts +32 -0
  393. package/ts_build/src/plugins/notion.js +131 -0
  394. package/ts_build/src/plugins/notion.js.map +1 -0
  395. package/ts_build/src/plugins/plugins.d.ts +11 -0
  396. package/ts_build/src/plugins/plugins.js +51 -0
  397. package/ts_build/src/plugins/plugins.js.map +1 -0
  398. package/ts_build/src/plugins/types.d.ts +5 -0
  399. package/ts_build/src/plugins/types.js +3 -0
  400. package/ts_build/src/plugins/types.js.map +1 -0
  401. package/ts_build/src/plugins/url.d.ts +8 -0
  402. package/ts_build/src/plugins/url.js +50 -0
  403. package/ts_build/src/plugins/url.js.map +1 -0
  404. package/ts_build/src/plugins/vim.d.ts +11 -0
  405. package/ts_build/src/plugins/vim.js +63 -0
  406. package/ts_build/src/plugins/vim.js.map +1 -0
  407. package/ts_build/src/prompts/BasicCodeDocumenter.d.ts +2 -0
  408. package/ts_build/src/prompts/BasicCodeDocumenter.js +4 -0
  409. package/ts_build/src/prompts/BasicCodeDocumenter.js.map +1 -0
  410. package/ts_build/src/prompts/BasicProjectDocumenter.d.ts +2 -0
  411. package/ts_build/src/prompts/BasicProjectDocumenter.js +4 -0
  412. package/ts_build/src/prompts/BasicProjectDocumenter.js.map +1 -0
  413. package/ts_build/src/prompts/EmbeddingSeachHelper.d.ts +2 -0
  414. package/ts_build/src/prompts/EmbeddingSeachHelper.js +4 -0
  415. package/ts_build/src/prompts/EmbeddingSeachHelper.js.map +1 -0
  416. package/ts_build/src/prompts/index.d.ts +13 -0
  417. package/ts_build/src/prompts/index.js +15 -0
  418. package/ts_build/src/prompts/index.js.map +1 -0
  419. package/ts_build/src/server/index.d.ts +1 -0
  420. package/ts_build/src/server/index.js +17 -0
  421. package/ts_build/src/server/index.js.map +1 -0
  422. package/ts_build/src/services/AgentService.d.ts +14 -0
  423. package/ts_build/src/services/AgentService.js +87 -0
  424. package/ts_build/src/services/AgentService.js.map +1 -0
  425. package/ts_build/src/services/EmbeddingService.d.ts +39 -0
  426. package/ts_build/src/services/EmbeddingService.js +307 -0
  427. package/ts_build/src/services/EmbeddingService.js.map +1 -0
  428. package/ts_build/src/services/EventService.d.ts +9 -0
  429. package/ts_build/src/services/EventService.js +20 -0
  430. package/ts_build/src/services/EventService.js.map +1 -0
  431. package/ts_build/src/services/GitHub.d.ts +11 -0
  432. package/ts_build/src/services/GitHub.js +52 -0
  433. package/ts_build/src/services/GitHub.js.map +1 -0
  434. package/ts_build/src/services/KnowhowClient.d.ts +18 -0
  435. package/ts_build/src/services/KnowhowClient.js +85 -0
  436. package/ts_build/src/services/KnowhowClient.js.map +1 -0
  437. package/ts_build/src/services/Mcp.d.ts +377 -0
  438. package/ts_build/src/services/Mcp.js +221 -0
  439. package/ts_build/src/services/Mcp.js.map +1 -0
  440. package/ts_build/src/services/McpServer.d.ts +19 -0
  441. package/ts_build/src/services/McpServer.js +104 -0
  442. package/ts_build/src/services/McpServer.js.map +1 -0
  443. package/ts_build/src/services/McpWebsocketTransport.d.ts +13 -0
  444. package/ts_build/src/services/McpWebsocketTransport.js +59 -0
  445. package/ts_build/src/services/McpWebsocketTransport.js.map +1 -0
  446. package/ts_build/src/services/S3.d.ts +9 -0
  447. package/ts_build/src/services/S3.js +116 -0
  448. package/ts_build/src/services/S3.js.map +1 -0
  449. package/ts_build/src/services/Tools.d.ts +19 -0
  450. package/ts_build/src/services/Tools.js +51 -0
  451. package/ts_build/src/services/Tools.js.map +1 -0
  452. package/ts_build/src/services/flags.d.ts +13 -0
  453. package/ts_build/src/services/flags.js +48 -0
  454. package/ts_build/src/services/flags.js.map +1 -0
  455. package/ts_build/src/services/index.d.ts +8 -0
  456. package/ts_build/src/services/index.js +38 -0
  457. package/ts_build/src/services/index.js.map +1 -0
  458. package/ts_build/src/terminal.d.ts +1 -0
  459. package/ts_build/src/terminal.js +35 -0
  460. package/ts_build/src/terminal.js.map +1 -0
  461. package/ts_build/src/types.d.ts +181 -0
  462. package/ts_build/src/types.js +94 -0
  463. package/ts_build/src/types.js.map +1 -0
  464. package/ts_build/src/utils/index.d.ts +24 -0
  465. package/ts_build/src/utils/index.js +116 -0
  466. package/ts_build/src/utils/index.js.map +1 -0
  467. package/ts_build/src/worker.d.ts +1 -0
  468. package/ts_build/src/worker.js +68 -0
  469. package/ts_build/src/worker.js.map +1 -0
  470. package/ts_build/tests/integration/figma.test.d.ts +1 -0
  471. package/ts_build/tests/integration/figma.test.js +47 -0
  472. package/ts_build/tests/integration/figma.test.js.map +1 -0
  473. package/ts_build/tests/integration/fileblocks/readwrite.test.d.ts +1 -0
  474. package/ts_build/tests/integration/fileblocks/readwrite.test.js +95 -0
  475. package/ts_build/tests/integration/fileblocks/readwrite.test.js.map +1 -0
  476. package/ts_build/tests/integration/patching.test.d.ts +1 -0
  477. package/ts_build/tests/integration/patching.test.js +117 -0
  478. package/ts_build/tests/integration/patching.test.js.map +1 -0
  479. package/ts_build/tests/languagePlugin.test.d.ts +1 -0
  480. package/ts_build/tests/languagePlugin.test.js +78 -0
  481. package/ts_build/tests/languagePlugin.test.js.map +1 -0
  482. package/ts_build/tests/patching/corrupted.test.d.ts +1 -0
  483. package/ts_build/tests/patching/corrupted.test.js +53 -0
  484. package/ts_build/tests/patching/corrupted.test.js.map +1 -0
  485. package/ts_build/tests/patching/imports.test.d.ts +1 -0
  486. package/ts_build/tests/patching/imports.test.js +61 -0
  487. package/ts_build/tests/patching/imports.test.js.map +1 -0
  488. package/ts_build/tests/test.spec.d.ts +1 -0
  489. package/ts_build/tests/test.spec.js +101 -0
  490. package/ts_build/tests/test.spec.js.map +1 -0
  491. package/tsconfig.json +31 -0
  492. package/tslint.json +11 -0
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "@tyvm/knowhow",
3
+ "version": "0.0.1",
4
+ "description": "ai cli with plugins and agents",
5
+ "main": "ts_build/src/index.js",
6
+ "bin": {
7
+ "knowhow": "ts_build/src/cli.js"
8
+ },
9
+ "scripts": {
10
+ "test": "jest --detectOpenHandles --forceExit --testTimeout 300000",
11
+ "test:debug": "node --inspect-brk ../../node_modules/jest/bin/jest.js --detectOpenHandles --forceExit --testTimeout 300000",
12
+ "compile": "tsc",
13
+ "start": "npm run compile && node ts_build/src/server/index.js",
14
+ "dataset:diffs:generate": "ts-node src/dataset/diffs/generate.ts",
15
+ "dataset:diffs:jsonl": "ts-node src/dataset/diffs/jsonl.ts",
16
+ "lint": "tslint ./src/**/*.ts"
17
+ },
18
+ "keywords": [],
19
+ "author": "Micah Riggan",
20
+ "license": "MIT",
21
+ "devDependencies": {
22
+ "@babel/preset-typescript": "^7.23.3",
23
+ "@types/asana": "^0.18.16",
24
+ "@types/diff": "^5.2.1",
25
+ "@types/express": "^4.17.13",
26
+ "@types/jest": "^29.5.13",
27
+ "@types/jira-client": "^7.1.9",
28
+ "@types/mocha": "^10.0.8",
29
+ "@types/node": "^20.6.3",
30
+ "@types/pdf-parse": "^1.1.4",
31
+ "@types/ws": "^8.18.1",
32
+ "jest": "^29.1.1",
33
+ "pdf-parse": "^1.1.1",
34
+ "prettier": "2.6.2",
35
+ "ts-jest": "^29.1.1",
36
+ "ts-node": "^10.7.0",
37
+ "tslint": "^6.1.3",
38
+ "tslint-config-prettier": "^1.18.0"
39
+ },
40
+ "dependencies": {
41
+ "@anthropic-ai/sdk": "^0.39.0",
42
+ "@aws-sdk/client-s3": "^3.588.0",
43
+ "@google/genai": "^0.14.1",
44
+ "@inquirer/editor": "^1.2.13",
45
+ "@linear/sdk": "^12.0.0",
46
+ "@modelcontextprotocol/sdk": "^1.7.0",
47
+ "@notionhq/client": "^2.2.14",
48
+ "@octokit/rest": "^20.0.2",
49
+ "asana": "^3.0.16",
50
+ "axios": "^1.5.0",
51
+ "cheerio": "^1.0.0",
52
+ "diff": "^5.2.0",
53
+ "express": "^4.19.2",
54
+ "figma-js": "^1.16.1-0",
55
+ "gitignore-to-glob": "^0.3.0",
56
+ "jira-client": "^8.2.2",
57
+ "marked": "^10.0.0",
58
+ "marked-terminal": "^6.2.0",
59
+ "morgan": "^1.10.0",
60
+ "node-fetch": "^3.2.3",
61
+ "node-pty": "^1.0.0",
62
+ "node-record-lpcm16": "^1.0.1",
63
+ "openai": "4.89.1",
64
+ "ora": "^5.4.1",
65
+ "parse-diff": "^0.11.1",
66
+ "playwright": "^1.52.0",
67
+ "playwright-extra": "^4.3.6",
68
+ "progress-estimator": "^0.3.1",
69
+ "puppeteer": "^24.4.0",
70
+ "puppeteer-extra-plugin-stealth": "^2.11.2",
71
+ "source-map-support": "^0.5.21",
72
+ "typescript": "^4.6.3",
73
+ "ws": "^8.18.1",
74
+ "youtube-dl-exec": "^2.5.5",
75
+ "zod": "^3.24.2"
76
+ },
77
+ "directories": {
78
+ "test": "tests"
79
+ },
80
+ "repository": {
81
+ "type": "git",
82
+ "url": "git+ssh://git@github.com/tyvm-ai/knowhow.git"
83
+ },
84
+ "types": "./ts_build/src/index.d.ts",
85
+ "bugs": {
86
+ "url": "https://github.com/tyvm-ai/knowhow/issues"
87
+ },
88
+ "homepage": "https://github.com/tyvm-ai/knowhow#readme"
89
+ }
@@ -0,0 +1,619 @@
1
+ import { EventEmitter } from "events";
2
+ import {
3
+ GenericClient,
4
+ Message,
5
+ OutputMessage,
6
+ Tool,
7
+ ToolCall,
8
+ } from "../../clients/types";
9
+ import { IAgent } from "../interface";
10
+ import { ToolsService, Tools } from "../../services/Tools";
11
+ import {
12
+ mcpToolName,
13
+ replaceEscapedNewLines,
14
+ restoreEscapedNewLines,
15
+ } from "../../utils";
16
+ import { Agents, AgentService } from "../../services/AgentService";
17
+ import { Events, EventService } from "../../services/EventService";
18
+ import { AIClient, Clients } from "../../clients";
19
+ import { Models, openai } from "../../ai";
20
+
21
+ export { Message, Tool, ToolCall };
22
+ export interface ModelPreference {
23
+ model: string;
24
+ provider: keyof typeof Clients.clients;
25
+ }
26
+
27
+ export abstract class BaseAgent implements IAgent {
28
+ abstract name: string;
29
+ abstract description: string;
30
+
31
+ private status = "in_progress";
32
+ private lastHealthCheckTime: number = 0;
33
+ protected provider = "openai";
34
+ protected modelName: string = Models.openai.GPT_4o;
35
+ protected client: null | GenericClient = null;
36
+ protected modelPreferences: ModelPreference[] = [];
37
+ protected currentModelPreferenceIndex = 0;
38
+ protected easyFinalAnswer = false;
39
+ protected requiredToolNames = ["finalAnswer"];
40
+ protected totalCostUsd = 0;
41
+ protected currentThread = 0;
42
+ protected threads = [] as Message[][];
43
+ protected pendingUserMessages = [] as Message[];
44
+ protected taskBreakdown = "";
45
+ protected summaries = [] as string[];
46
+
47
+ public agentEvents = new EventEmitter();
48
+ public eventTypes = {
49
+ newThread: "new_thread",
50
+ threadUpdate: "thread_update",
51
+ costUpdate: "cost_update",
52
+ toolUsed: "tool_used",
53
+ done: "done",
54
+ pause: "pause",
55
+ kill: "kill",
56
+ unpause: "unpause",
57
+ };
58
+
59
+ disabledTools = [];
60
+
61
+ constructor(
62
+ public tools: ToolsService = Tools,
63
+ public events: EventService = Events
64
+ ) {}
65
+
66
+ newTask() {
67
+ this.currentThread = 0;
68
+ this.threads = [];
69
+ this.taskBreakdown = "";
70
+ this.summaries = [];
71
+ this.totalCostUsd = 0;
72
+ this.status = "in_progress";
73
+ }
74
+
75
+ register() {
76
+ this.events.registerAgent(this);
77
+ }
78
+
79
+ setModelPreferences(value: ModelPreference[]) {
80
+ this.modelPreferences = value;
81
+ if (value.length) {
82
+ this.updatePreferences(value[0]);
83
+ }
84
+ }
85
+
86
+ updatePreferences(value: ModelPreference) {
87
+ this.setModel(value.model);
88
+ this.setProvider(value.provider);
89
+ }
90
+
91
+ nextModel() {
92
+ this.currentModelPreferenceIndex++;
93
+ if (this.currentModelPreferenceIndex >= this.modelPreferences.length) {
94
+ throw new Error("We have exhausted all model preferences.");
95
+ }
96
+ const nextModel = this.modelPreferences[this.currentModelPreferenceIndex];
97
+ this.updatePreferences(nextModel);
98
+ }
99
+
100
+ getModel(): string {
101
+ return this.modelName;
102
+ }
103
+
104
+ setModel(value: string) {
105
+ this.modelName = value;
106
+ }
107
+
108
+ getProvider() {
109
+ return this.provider;
110
+ }
111
+
112
+ setProvider(value: keyof typeof Clients.clients) {
113
+ this.provider = value;
114
+ }
115
+
116
+ getClient() {
117
+ if (!this.client) {
118
+ this.client = Clients.getClient(this.provider)?.client;
119
+ }
120
+ return this.client;
121
+ }
122
+
123
+ setClient(client: GenericClient) {
124
+ this.client = client;
125
+ }
126
+
127
+ setEasyFinalAnswer(value: boolean) {
128
+ this.easyFinalAnswer = value;
129
+ }
130
+
131
+ getEnabledTools() {
132
+ return this.tools
133
+ .getTools()
134
+ .filter((t) => !this.disabledTools.includes(t.function.name));
135
+ }
136
+
137
+ getEnabledToolNames() {
138
+ return this.getEnabledTools().map((t) => t.function.name);
139
+ }
140
+
141
+ disableTool(toolName: string) {
142
+ this.disabledTools.push(toolName);
143
+ }
144
+
145
+ isToolEnabled(toolName: string) {
146
+ return !!this.getEnabledTools().find((t) => t.function.name === toolName);
147
+ }
148
+
149
+ enableTool(toolName: string) {
150
+ if (!this.isToolEnabled(toolName)) {
151
+ this.disabledTools = this.disabledTools.filter((t) => t !== toolName);
152
+ }
153
+ }
154
+
155
+ adjustTotalCostUsd(cost: number) {
156
+ if (cost) {
157
+ this.totalCostUsd += cost;
158
+ this.agentEvents.emit(this.eventTypes.costUpdate, this.totalCostUsd);
159
+ }
160
+ }
161
+
162
+ getTotalCostUsd() {
163
+ return this.totalCostUsd;
164
+ }
165
+
166
+ startNewThread(messages: Message[]) {
167
+ this.currentThread++;
168
+ this.agentEvents.emit(this.eventTypes.newThread, messages);
169
+ this.updateCurrentThread(messages);
170
+ }
171
+
172
+ updateCurrentThread(messages: Message[]) {
173
+ this.threads[this.currentThread] = messages;
174
+ this.agentEvents.emit(this.eventTypes.threadUpdate, messages);
175
+ }
176
+
177
+ getThreads() {
178
+ return this.threads;
179
+ }
180
+
181
+ getSummaries() {
182
+ return this.summaries;
183
+ }
184
+
185
+ abstract getInitialMessages(userInput: string): Promise<Message[]>;
186
+
187
+ async processToolMessages(toolCall: ToolCall) {
188
+ const functionName = toolCall.function.name;
189
+ const functionToCall = this.tools.getFunction(functionName);
190
+
191
+ console.log(toolCall);
192
+ const functionArgs = JSON.parse(
193
+ this.formatAiResponse(toolCall.function.arguments)
194
+ );
195
+
196
+ const toJsonIfObject = (arg: any) => {
197
+ if (typeof arg === "object") {
198
+ return JSON.stringify(arg, null, 2);
199
+ }
200
+ return arg;
201
+ };
202
+
203
+ const toolDefinition = this.tools.getTool(functionName);
204
+ const properties = toolDefinition?.function?.parameters?.properties || {};
205
+ const isPositional =
206
+ toolDefinition?.function?.parameters?.positional || false;
207
+ const fnArgs = isPositional
208
+ ? Object.keys(properties).map((p) => functionArgs[p])
209
+ : functionArgs;
210
+
211
+ console.log(
212
+ `Calling function ${functionName} with args:`,
213
+ JSON.stringify(fnArgs, null, 2)
214
+ );
215
+
216
+ if (!functionToCall) {
217
+ const options = this.getEnabledToolNames().join(", ");
218
+ const error = `Function ${functionName} not found, options are ${options}`;
219
+ console.log(error);
220
+ return [
221
+ {
222
+ tool_call_id: toolCall.id,
223
+ role: "tool",
224
+ name: "error",
225
+ content: error,
226
+ },
227
+ ];
228
+ }
229
+
230
+ const functionResponse = await Promise.resolve(
231
+ isPositional ? functionToCall(...fnArgs) : functionToCall(fnArgs)
232
+ ).catch((e) => "ERROR: " + e.message);
233
+
234
+ this.agentEvents.emit(this.eventTypes.toolUsed, {
235
+ toolCall,
236
+ functionResponse,
237
+ });
238
+
239
+ let toolMessages = [];
240
+
241
+ if (functionName === "multi_tool_use.parallel") {
242
+ const args = fnArgs[0] as {
243
+ recipient_name: string;
244
+ parameters: any;
245
+ }[];
246
+
247
+ toolMessages = args.map((call, index) => {
248
+ return {
249
+ tool_call_id: toolCall.id + "_" + index,
250
+ role: "tool",
251
+ name: call.recipient_name.split(".").pop(),
252
+ content: toJsonIfObject(functionResponse[index]) || "Done",
253
+ };
254
+ });
255
+ }
256
+
257
+ toolMessages = [
258
+ {
259
+ tool_call_id: toolCall.id,
260
+ role: "tool",
261
+ name: functionName,
262
+ content: toJsonIfObject(functionResponse) || "Done",
263
+ },
264
+ ];
265
+
266
+ console.log(toolMessages);
267
+
268
+ return toolMessages;
269
+ }
270
+
271
+ logMessages(messages: Message[]) {
272
+ for (const message of messages) {
273
+ if (message.role === "assistant") {
274
+ console.log(message.content);
275
+ }
276
+ }
277
+ }
278
+
279
+ formatInputContent(userInput: string) {
280
+ return replaceEscapedNewLines(userInput);
281
+ }
282
+
283
+ formatAiResponse(response: string) {
284
+ return restoreEscapedNewLines(response);
285
+ }
286
+
287
+ formatInputMessages(messages: Message[]) {
288
+ return messages.map((m) => ({
289
+ ...m,
290
+ content:
291
+ typeof m.content === "string"
292
+ ? this.formatInputContent(m.content)
293
+ : m.content,
294
+ })) as Message[];
295
+ }
296
+
297
+ formatOutputMessages(messages: Message[]) {
298
+ return messages.map((m) => ({
299
+ ...m,
300
+ content:
301
+ typeof m.content === "string"
302
+ ? this.formatAiResponse(m.content)
303
+ : m.content,
304
+ })) as Message[];
305
+ }
306
+
307
+ async healthCheck() {
308
+ try {
309
+ const canCallProvider = await this.getClient().createChatCompletion({
310
+ messages: [{ role: "user", content: "Hello!" }],
311
+ model: this.getModel(),
312
+ max_tokens: 2,
313
+ });
314
+ return true;
315
+ } catch (e) {
316
+ console.error(e);
317
+ return false;
318
+ }
319
+ }
320
+
321
+ async selectHealthyModel() {
322
+ const currentTime = Date.now();
323
+ if (currentTime - this.lastHealthCheckTime < 60 * 1000) {
324
+ return;
325
+ }
326
+
327
+ let healthy = await this.healthCheck();
328
+ this.lastHealthCheckTime = Date.now();
329
+ while (!healthy) {
330
+ this.nextModel();
331
+ healthy = await this.healthCheck();
332
+ }
333
+ await this.healthCheck();
334
+ }
335
+
336
+ setNotHealthy() {
337
+ this.lastHealthCheckTime = 0;
338
+ }
339
+
340
+ pause() {
341
+ console.log("Pausing agent");
342
+ this.agentEvents.emit(this.eventTypes.pause, this);
343
+ this.status = this.eventTypes.pause;
344
+ }
345
+
346
+ unpause() {
347
+ console.log("Unpausing agent");
348
+ this.agentEvents.emit(this.eventTypes.unpause, this);
349
+ this.status = "in_progress";
350
+ }
351
+
352
+ async unpaused() {
353
+ return new Promise((resolve) => {
354
+ console.log("Waiting for agent to unpause");
355
+ this.agentEvents.once(this.eventTypes.unpause, () => {
356
+ console.log("Agent resumed");
357
+ resolve(true);
358
+ });
359
+ this.agentEvents.once(this.eventTypes.done, () => {
360
+ resolve(true);
361
+ });
362
+ });
363
+ }
364
+
365
+ async kill() {
366
+ console.log("Killing agent");
367
+ this.agentEvents.emit(this.eventTypes.kill, this);
368
+ this.status = this.eventTypes.kill;
369
+
370
+ this.addPendingUserMessage({
371
+ role: "user",
372
+ content: `<Workflow>The user has requested the task to end, please call ${this.requiredToolNames} with a report of your ending state</Workflow>`,
373
+ } as Message);
374
+ }
375
+
376
+ async call(userInput: string, _messages?: Message[]) {
377
+ if (this.status === this.eventTypes.pause) {
378
+ await this.unpaused();
379
+ }
380
+
381
+ await this.selectHealthyModel();
382
+
383
+ try {
384
+ const model = this.getModel();
385
+ let messages = _messages || (await this.getInitialMessages(userInput));
386
+ const taskBreakdown = await this.getTaskBreakdown(messages);
387
+
388
+ if (this.pendingUserMessages.length) {
389
+ messages.push(...this.pendingUserMessages);
390
+ this.pendingUserMessages = [];
391
+ }
392
+
393
+ messages = this.formatInputMessages(messages);
394
+ this.updateCurrentThread(messages);
395
+
396
+ const startIndex = 0;
397
+ const endIndex = messages.length;
398
+ const compressThreshold = 10000;
399
+
400
+ const response = await this.getClient().createChatCompletion({
401
+ model,
402
+ messages,
403
+ tools: this.getEnabledTools(),
404
+ tool_choice: "auto",
405
+ });
406
+
407
+ if (response?.usd_cost === undefined) {
408
+ console.warn("Response cost is undefined", response);
409
+ }
410
+
411
+ this.adjustTotalCostUsd(response?.usd_cost);
412
+ this.logMessages(response.choices.map((c) => c.message));
413
+
414
+ const firstMessage = response.choices[0].message;
415
+ const newToolCalls = response.choices.flatMap(
416
+ (c) => c.message.tool_calls
417
+ );
418
+
419
+ for (const choice of response.choices) {
420
+ const responseMessage = choice.message;
421
+ console.log(responseMessage);
422
+
423
+ const toolCalls = responseMessage.tool_calls;
424
+ if (responseMessage.tool_calls) {
425
+ // extend conversation with assistant's reply
426
+ messages.push(responseMessage);
427
+
428
+ for (const toolCall of toolCalls) {
429
+ const toolMessages = await this.processToolMessages(toolCall);
430
+ // Add the tool responses to the thread
431
+ messages.push(...(toolMessages as Message[]));
432
+
433
+ const finalMessage = toolMessages.find(
434
+ (m) =>
435
+ this.requiredToolNames.includes(m.name) ||
436
+ this.requiredToolNames.includes(mcpToolName(m.name))
437
+ );
438
+
439
+ if (finalMessage) {
440
+ const doneMsg = finalMessage.content || "Done";
441
+ this.agentEvents.emit(this.eventTypes.done, doneMsg);
442
+ return doneMsg;
443
+ }
444
+ }
445
+ }
446
+ }
447
+
448
+ // Early exit: not required to call tool
449
+ if (
450
+ response.choices.length === 1 &&
451
+ firstMessage.content &&
452
+ this.easyFinalAnswer
453
+ ) {
454
+ this.agentEvents.emit(this.eventTypes.done, firstMessage.content);
455
+ return firstMessage.content;
456
+ }
457
+
458
+ // Early exit: killed, agent was requested to wrap up
459
+ if (this.pendingUserMessages.length === 0 && this.status === "killed") {
460
+ console.log("Agent killed, stopping execution");
461
+ this.status = "killed";
462
+ this.agentEvents.emit(this.eventTypes.done, firstMessage.content);
463
+ return firstMessage.content;
464
+ }
465
+
466
+ if (this.getMessagesLength(messages) > compressThreshold) {
467
+ console.log(
468
+ "Compressing messages",
469
+ this.getMessagesLength(messages),
470
+ "exceeds",
471
+ compressThreshold
472
+ );
473
+ messages = await this.compressMessages(messages, startIndex, endIndex);
474
+ this.startNewThread(messages);
475
+ }
476
+
477
+ if (["assistant", "tool"].includes(messages[messages.length - 1].role)) {
478
+ // sometimes the agent just says a message and doesn't call a tool, or compression ends on a tool message
479
+ console.log(
480
+ "Agent continuing to the next iteration, reminding agent how to terminate"
481
+ );
482
+ messages.push({
483
+ role: "user",
484
+ content: `<Workflow>workflow continues until you call on of ${this.requiredToolNames}. Any continuation messages should be enclosed in workflow tags to hide intermediate work from users.</Workflow>`,
485
+ });
486
+ }
487
+
488
+ this.updateCurrentThread(messages);
489
+ return this.call(userInput, messages);
490
+ } catch (e) {
491
+ if (e.toString().includes("429")) {
492
+ this.setNotHealthy();
493
+ return this.call(userInput, _messages);
494
+ }
495
+
496
+ console.error(e);
497
+ this.agentEvents.emit(this.eventTypes.done, e.message);
498
+ return e.message;
499
+ }
500
+ }
501
+
502
+ addPendingUserMessage(message: Message) {
503
+ this.pendingUserMessages.push(message);
504
+ }
505
+
506
+ getMessagesLength(messages: Message[]) {
507
+ return JSON.stringify(messages).split(" ").length;
508
+ }
509
+
510
+ async getTaskBreakdown(messages: Message[]) {
511
+ if (this.taskBreakdown) {
512
+ return this.taskBreakdown;
513
+ }
514
+
515
+ const taskPrompt = `
516
+ Generate a detailed task breakdown for this conversation, include a section for the following:
517
+ 1. Task List
518
+ 2. Completion Criteria - when the agent should stop
519
+
520
+ : \n\n${JSON.stringify(messages)}`;
521
+
522
+ const model = this.getModel();
523
+
524
+ const response = await this.getClient().createChatCompletion({
525
+ model,
526
+ messages: [
527
+ {
528
+ role: "user",
529
+ content: taskPrompt,
530
+ },
531
+ ],
532
+ });
533
+
534
+ this.adjustTotalCostUsd(response.usd_cost);
535
+
536
+ console.log(response);
537
+
538
+ this.taskBreakdown = response.choices[0].message.content;
539
+ return this.taskBreakdown;
540
+ }
541
+
542
+ async compressMessages(
543
+ messages: Message[],
544
+ startIndex: number,
545
+ endIndex: number
546
+ ) {
547
+ const toCompress = messages.slice(startIndex, endIndex);
548
+ const toCompressPrompt = `We are compressing our conversation to save memory.
549
+ Please summarize the conversation so far, so that we may continue the original task with a smaller context
550
+
551
+ Include the following sections:
552
+ 1. Initial Request - what this agent was originally tasked with.
553
+ 2. Progress - what has been tried so far,
554
+ 3. Next Steps - what we're about to do next to continue the user's original request.
555
+ 4. Tasks remaining - what tasks are left from the initial task breakdown.
556
+
557
+ This summary will become the agent's only memory of the past, all other messages will be dropped:
558
+ ${JSON.stringify(toCompress)}
559
+
560
+ Our initial task breakdown: ${this.taskBreakdown}`;
561
+
562
+ const model = this.getModel();
563
+
564
+ const response = await this.getClient().createChatCompletion({
565
+ model,
566
+ messages: [
567
+ {
568
+ role: "user",
569
+ content: toCompressPrompt,
570
+ },
571
+ ],
572
+ });
573
+
574
+ this.adjustTotalCostUsd(response.usd_cost);
575
+
576
+ const summaries = response.choices.map((c) => c.message.content);
577
+ this.summaries.push(...summaries);
578
+
579
+ const startMessages = [
580
+ {
581
+ role: "user",
582
+ content: `
583
+ Initial task breakdown:
584
+ ${this.taskBreakdown}
585
+
586
+ We have just compressed the conversation to save memory:
587
+ ${JSON.stringify(summaries)}
588
+
589
+ Please continue the task from where we left off
590
+ `,
591
+ },
592
+ ] as Message[];
593
+ const systemMesasges = toCompress.filter((m) => m.role === "system");
594
+
595
+ const newMessages = [
596
+ ...systemMesasges,
597
+ ...startMessages,
598
+ ...messages.slice(endIndex),
599
+ ];
600
+
601
+ const oldLength = this.getMessagesLength(messages);
602
+ const newLength = this.getMessagesLength(newMessages);
603
+ const compressionRatio = (
604
+ ((oldLength - newLength) / oldLength) *
605
+ 100
606
+ ).toFixed(2);
607
+
608
+ console.log(
609
+ "Compressed messages from",
610
+ oldLength,
611
+ "to",
612
+ newLength,
613
+ compressionRatio + "%",
614
+ "reduction in size"
615
+ );
616
+
617
+ return newMessages;
618
+ }
619
+ }