@tyvm/knowhow 0.0.33 → 0.0.35

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 (504) hide show
  1. package/autodoc/plugins/downloader/downloader.mdx +2 -2
  2. package/benchmarks/.dockerignore +7 -0
  3. package/benchmarks/README.md +166 -0
  4. package/benchmarks/docker/Dockerfile +68 -0
  5. package/benchmarks/example-config.yml +27 -0
  6. package/benchmarks/jest.config.js +13 -0
  7. package/benchmarks/package-lock.json +4297 -0
  8. package/benchmarks/package.json +39 -0
  9. package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +2814 -0
  10. package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +2014 -0
  11. package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +3121 -0
  12. package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +98 -0
  13. package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +3256 -0
  14. package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +4298 -0
  15. package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3031 -0
  16. package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +2990 -0
  17. package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3256 -0
  18. package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3007 -0
  19. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +3256 -0
  20. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +3036 -0
  21. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +3280 -0
  22. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +1920 -0
  23. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +3281 -0
  24. package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +2896 -0
  25. package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3011 -0
  26. package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +3003 -0
  27. package/benchmarks/scripts/build-and-run.sh +47 -0
  28. package/benchmarks/scripts/clone-exercism.sh +92 -0
  29. package/benchmarks/scripts/validate.sh +48 -0
  30. package/benchmarks/src/__tests__/runner.test.ts +27 -0
  31. package/benchmarks/src/cli.ts +90 -0
  32. package/benchmarks/src/evaluators/EvaluatorRegistry.ts +64 -0
  33. package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +183 -0
  34. package/benchmarks/src/evaluators/index.ts +3 -0
  35. package/benchmarks/src/evaluators/types.ts +22 -0
  36. package/benchmarks/src/index.ts +3 -0
  37. package/benchmarks/src/providers.ts +13 -0
  38. package/benchmarks/src/runner.ts +824 -0
  39. package/benchmarks/src/types.ts +63 -0
  40. package/benchmarks/tsconfig.json +19 -0
  41. package/jest.config.js +2 -1
  42. package/leaderboard/README.md +148 -0
  43. package/leaderboard/app/api/benchmark-data/route.ts +131 -0
  44. package/leaderboard/app/api/benchmark-detail/route.ts +172 -0
  45. package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +501 -0
  46. package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +375 -0
  47. package/leaderboard/app/globals.css +27 -0
  48. package/leaderboard/app/layout.tsx +21 -0
  49. package/leaderboard/app/page.tsx +170 -0
  50. package/leaderboard/components/LeaderboardTable.tsx +168 -0
  51. package/leaderboard/components/PerformanceChart.tsx +109 -0
  52. package/leaderboard/next-env.d.ts +5 -0
  53. package/leaderboard/next.config.js +4 -0
  54. package/leaderboard/package-lock.json +6363 -0
  55. package/leaderboard/package.json +28 -0
  56. package/leaderboard/postcss.config.js +6 -0
  57. package/leaderboard/tailwind.config.js +17 -0
  58. package/leaderboard/tsconfig.json +28 -0
  59. package/leaderboard/types/benchmark.ts +67 -0
  60. package/leaderboard/utils/dataProcessor.ts +33 -0
  61. package/package.json +2 -1
  62. package/src/agents/base/base.ts +182 -24
  63. package/src/agents/base/prompt.ts +28 -0
  64. package/src/agents/index.ts +3 -0
  65. package/src/agents/patcher/patcher.ts +6 -4
  66. package/src/agents/setup/setup.ts +56 -0
  67. package/src/agents/tools/agentCall.ts +6 -2
  68. package/src/agents/tools/aiClient.ts +74 -8
  69. package/src/agents/tools/execCommand.ts +13 -14
  70. package/src/agents/tools/executeScript/README.md +16 -0
  71. package/src/agents/tools/index.ts +2 -0
  72. package/src/agents/tools/list.ts +73 -16
  73. package/src/agents/tools/startAgentTask.ts +109 -0
  74. package/src/agents/tools/textSearch.ts +1 -1
  75. package/src/agents/tools/visionTool.ts +31 -2
  76. package/src/agents/tools/ycmd/client.ts +608 -0
  77. package/src/agents/tools/ycmd/definitions.ts +294 -0
  78. package/src/agents/tools/ycmd/detection.ts +211 -0
  79. package/src/agents/tools/ycmd/index.ts +11 -0
  80. package/src/agents/tools/ycmd/installer.ts +251 -0
  81. package/src/agents/tools/ycmd/server.ts +535 -0
  82. package/src/agents/tools/ycmd/serverManager.ts +316 -0
  83. package/src/agents/tools/ycmd/tools/completion.ts +113 -0
  84. package/src/agents/tools/ycmd/tools/diagnostics.ts +155 -0
  85. package/src/agents/tools/ycmd/tools/getLocations.ts +173 -0
  86. package/src/agents/tools/ycmd/tools/goto.ts +169 -0
  87. package/src/agents/tools/ycmd/tools/refactor.ts +204 -0
  88. package/src/agents/tools/ycmd/tools/signature.ts +174 -0
  89. package/src/agents/tools/ycmd/tools/start.ts +95 -0
  90. package/src/agents/tools/ycmd/utils/pathUtils.ts +59 -0
  91. package/src/ai.ts +15 -0
  92. package/src/chat/CliChatService.ts +277 -0
  93. package/src/chat/modules/AgentModule.ts +985 -0
  94. package/src/chat/modules/AskModule.ts +98 -0
  95. package/src/chat/modules/BaseChatModule.ts +66 -0
  96. package/src/chat/modules/InternalChatModule.ts +174 -0
  97. package/src/chat/modules/SearchModule.ts +166 -0
  98. package/src/chat/modules/SetupModule.ts +185 -0
  99. package/src/chat/modules/SystemModule.ts +120 -0
  100. package/src/chat/modules/VoiceModule.ts +70 -0
  101. package/src/chat/modules/index.js +5 -0
  102. package/src/chat/types.ts +97 -0
  103. package/src/chat.ts +9 -1
  104. package/src/chat2.ts +62 -0
  105. package/src/cli.ts +264 -35
  106. package/src/clients/anthropic.ts +14 -7
  107. package/src/clients/gemini.ts +15 -7
  108. package/src/clients/http.ts +17 -7
  109. package/src/clients/index.ts +117 -4
  110. package/src/clients/knowhow.ts +7 -2
  111. package/src/clients/knowhowMcp.ts +118 -0
  112. package/src/clients/openai.ts +32 -8
  113. package/src/clients/types.ts +1 -0
  114. package/src/clients/xai.ts +17 -5
  115. package/src/config.ts +30 -5
  116. package/src/conversion.ts +4 -1
  117. package/src/login.ts +26 -9
  118. package/src/microphone.ts +0 -1
  119. package/src/plugins/downloader/downloader.ts +191 -49
  120. package/src/plugins/downloader/plugin.ts +3 -1
  121. package/src/plugins/plugins.ts +3 -0
  122. package/src/processors/CustomVariables.ts +425 -0
  123. package/src/processors/HarmonyToolProcessor.ts +264 -0
  124. package/src/processors/XmlToolCallProcessor.ts +533 -0
  125. package/src/processors/index.ts +3 -0
  126. package/src/prompts/KnowhowConfigExamples.ts +376 -0
  127. package/src/services/KnowhowClient.ts +49 -3
  128. package/src/services/Mcp.ts +42 -3
  129. package/src/services/McpServer.ts +14 -4
  130. package/src/services/McpWebsocketTransport.ts +21 -7
  131. package/src/services/MessageProcessor.ts +10 -5
  132. package/src/services/index.ts +5 -0
  133. package/src/services/script-execution/ScriptExecutor.ts +34 -1
  134. package/src/services/types.ts +17 -14
  135. package/src/types.ts +17 -0
  136. package/src/utils/index.ts +138 -0
  137. package/tests/XmlToolCallProcessor.test.ts +468 -0
  138. package/tests/manual/ycmd/debug_diagnostics_test.ts +127 -0
  139. package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +26 -0
  140. package/tests/manual/ycmd/fixtures/file_change_test.ts +17 -0
  141. package/tests/manual/ycmd/minimal_advanced_test.ts +108 -0
  142. package/tests/manual/ycmd/simple_diagnostics_test.ts +61 -0
  143. package/tests/manual/ycmd/simple_test.ts +74 -0
  144. package/tests/manual/ycmd/test-typescript-sample.ts +34 -0
  145. package/tests/manual/ycmd/test_advanced_features.ts +407 -0
  146. package/tests/manual/ycmd/test_advanced_with_tools.ts +320 -0
  147. package/tests/manual/ycmd/test_comprehensive_typescript.ts +179 -0
  148. package/tests/manual/ycmd/test_diagnostics_file_changes.ts +249 -0
  149. package/tests/manual/ycmd/test_diagnostics_fix.ts +99 -0
  150. package/tests/manual/ycmd/test_diagnostics_simple.ts +100 -0
  151. package/tests/manual/ycmd/test_diagnostics_timing.ts +120 -0
  152. package/tests/manual/ycmd/test_discover_commands.ts +310 -0
  153. package/tests/manual/ycmd/test_endpoints.ts +115 -0
  154. package/tests/manual/ycmd/test_final_comprehensive.ts +218 -0
  155. package/tests/manual/ycmd/test_final_validation.ts +150 -0
  156. package/tests/manual/ycmd/test_implementation.js +42 -0
  157. package/tests/manual/ycmd/test_individual_ycmd_tool.ts +39 -0
  158. package/tests/manual/ycmd/test_server_manager.ts +52 -0
  159. package/tests/manual/ycmd/test_simple_debug.ts +86 -0
  160. package/tests/manual/ycmd/test_tsserver_workflow.js +83 -0
  161. package/tests/manual/ycmd/test_tsserver_workflow.ts +122 -0
  162. package/tests/manual/ycmd/test_typescript_simple.ts +48 -0
  163. package/tests/manual/ycmd/test_typescript_ycmd.ts +105 -0
  164. package/tests/manual/ycmd/test_workspace_config.ts +90 -0
  165. package/tests/manual/ycmd/test_ycmd_auto_start.ts +137 -0
  166. package/tests/manual/ycmd/test_ycmd_comprehensive.ts +73 -0
  167. package/tests/manual/ycmd/test_ycmd_connection.py +10 -0
  168. package/tests/manual/ycmd/test_ycmd_direct.ts +142 -0
  169. package/tests/manual/ycmd/test_ycmd_experiment.ts +48 -0
  170. package/tests/manual/ycmd/test_ycmd_final.ts +200 -0
  171. package/tests/manual/ycmd/test_ycmd_fixed.py +18 -0
  172. package/tests/manual/ycmd/test_ycmd_integration.ts +112 -0
  173. package/tests/manual/ycmd/test_ycmd_simple.ts +45 -0
  174. package/tests/manual/ycmd/test_ycmd_usage.py +27 -0
  175. package/tests/manual/ycmd/working_simple_test.ts +134 -0
  176. package/ts_build/src/agents/base/base.d.ts +15 -1
  177. package/ts_build/src/agents/base/base.js +121 -20
  178. package/ts_build/src/agents/base/base.js.map +1 -1
  179. package/ts_build/src/agents/base/prompt.d.ts +1 -1
  180. package/ts_build/src/agents/base/prompt.js +28 -0
  181. package/ts_build/src/agents/base/prompt.js.map +1 -1
  182. package/ts_build/src/agents/index.d.ts +2 -0
  183. package/ts_build/src/agents/index.js +2 -0
  184. package/ts_build/src/agents/index.js.map +1 -1
  185. package/ts_build/src/agents/patcher/patcher.js +6 -3
  186. package/ts_build/src/agents/patcher/patcher.js.map +1 -1
  187. package/ts_build/src/agents/setup/setup.d.ts +8 -0
  188. package/ts_build/src/agents/setup/setup.js +59 -0
  189. package/ts_build/src/agents/setup/setup.js.map +1 -0
  190. package/ts_build/src/agents/tools/agentCall.js +5 -2
  191. package/ts_build/src/agents/tools/agentCall.js.map +1 -1
  192. package/ts_build/src/agents/tools/aiClient.d.ts +6 -5
  193. package/ts_build/src/agents/tools/aiClient.js +37 -6
  194. package/ts_build/src/agents/tools/aiClient.js.map +1 -1
  195. package/ts_build/src/agents/tools/execCommand.d.ts +2 -2
  196. package/ts_build/src/agents/tools/execCommand.js +5 -6
  197. package/ts_build/src/agents/tools/execCommand.js.map +1 -1
  198. package/ts_build/src/agents/tools/executeScript/index.d.ts +1 -1
  199. package/ts_build/src/agents/tools/index.d.ts +2 -0
  200. package/ts_build/src/agents/tools/index.js +2 -0
  201. package/ts_build/src/agents/tools/index.js.map +1 -1
  202. package/ts_build/src/agents/tools/list.js +66 -16
  203. package/ts_build/src/agents/tools/list.js.map +1 -1
  204. package/ts_build/src/agents/tools/startAgentTask.d.ts +13 -0
  205. package/ts_build/src/agents/tools/startAgentTask.js +74 -0
  206. package/ts_build/src/agents/tools/startAgentTask.js.map +1 -0
  207. package/ts_build/src/agents/tools/startChatTask.d.ts +13 -0
  208. package/ts_build/src/agents/tools/startChatTask.js +73 -0
  209. package/ts_build/src/agents/tools/startChatTask.js.map +1 -0
  210. package/ts_build/src/agents/tools/textSearch.js +1 -1
  211. package/ts_build/src/agents/tools/textSearch.js.map +1 -1
  212. package/ts_build/src/agents/tools/visionTool.d.ts +1 -1
  213. package/ts_build/src/agents/tools/visionTool.js +23 -3
  214. package/ts_build/src/agents/tools/visionTool.js.map +1 -1
  215. package/ts_build/src/agents/tools/ycmd/client.d.ts +93 -0
  216. package/ts_build/src/agents/tools/ycmd/client.js +355 -0
  217. package/ts_build/src/agents/tools/ycmd/client.js.map +1 -0
  218. package/ts_build/src/agents/tools/ycmd/definitions.d.ts +345 -0
  219. package/ts_build/src/agents/tools/ycmd/definitions.js +298 -0
  220. package/ts_build/src/agents/tools/ycmd/definitions.js.map +1 -0
  221. package/ts_build/src/agents/tools/ycmd/detection.d.ts +11 -0
  222. package/ts_build/src/agents/tools/ycmd/detection.js +175 -0
  223. package/ts_build/src/agents/tools/ycmd/detection.js.map +1 -0
  224. package/ts_build/src/agents/tools/ycmd/index.d.ts +8 -0
  225. package/ts_build/src/agents/tools/ycmd/index.js +20 -0
  226. package/ts_build/src/agents/tools/ycmd/index.js.map +1 -0
  227. package/ts_build/src/agents/tools/ycmd/installer.d.ts +19 -0
  228. package/ts_build/src/agents/tools/ycmd/installer.js +196 -0
  229. package/ts_build/src/agents/tools/ycmd/installer.js.map +1 -0
  230. package/ts_build/src/agents/tools/ycmd/server.d.ts +35 -0
  231. package/ts_build/src/agents/tools/ycmd/server.js +363 -0
  232. package/ts_build/src/agents/tools/ycmd/server.js.map +1 -0
  233. package/ts_build/src/agents/tools/ycmd/serverManager.d.ts +39 -0
  234. package/ts_build/src/agents/tools/ycmd/serverManager.js +210 -0
  235. package/ts_build/src/agents/tools/ycmd/serverManager.js.map +1 -0
  236. package/ts_build/src/agents/tools/ycmd/tools/completion.d.ts +22 -0
  237. package/ts_build/src/agents/tools/ycmd/tools/completion.js +72 -0
  238. package/ts_build/src/agents/tools/ycmd/tools/completion.js.map +1 -0
  239. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.d.ts +42 -0
  240. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js +88 -0
  241. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js.map +1 -0
  242. package/ts_build/src/agents/tools/ycmd/tools/getLocations.d.ts +22 -0
  243. package/ts_build/src/agents/tools/ycmd/tools/getLocations.js +142 -0
  244. package/ts_build/src/agents/tools/ycmd/tools/getLocations.js.map +1 -0
  245. package/ts_build/src/agents/tools/ycmd/tools/goto.d.ts +20 -0
  246. package/ts_build/src/agents/tools/ycmd/tools/goto.js +101 -0
  247. package/ts_build/src/agents/tools/ycmd/tools/goto.js.map +1 -0
  248. package/ts_build/src/agents/tools/ycmd/tools/refactor.d.ts +32 -0
  249. package/ts_build/src/agents/tools/ycmd/tools/refactor.js +123 -0
  250. package/ts_build/src/agents/tools/ycmd/tools/refactor.js.map +1 -0
  251. package/ts_build/src/agents/tools/ycmd/tools/signature.d.ts +25 -0
  252. package/ts_build/src/agents/tools/ycmd/tools/signature.js +110 -0
  253. package/ts_build/src/agents/tools/ycmd/tools/signature.js.map +1 -0
  254. package/ts_build/src/agents/tools/ycmd/tools/start.d.ts +17 -0
  255. package/ts_build/src/agents/tools/ycmd/tools/start.js +65 -0
  256. package/ts_build/src/agents/tools/ycmd/tools/start.js.map +1 -0
  257. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.d.ts +4 -0
  258. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js +67 -0
  259. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js.map +1 -0
  260. package/ts_build/src/ai.d.ts +1 -0
  261. package/ts_build/src/ai.js +40 -1
  262. package/ts_build/src/ai.js.map +1 -1
  263. package/ts_build/src/chat/ChatCommandHandler.d.ts +36 -0
  264. package/ts_build/src/chat/ChatCommandHandler.js +268 -0
  265. package/ts_build/src/chat/ChatCommandHandler.js.map +1 -0
  266. package/ts_build/src/chat/ChatInputManager.d.ts +22 -0
  267. package/ts_build/src/chat/ChatInputManager.js +85 -0
  268. package/ts_build/src/chat/ChatInputManager.js.map +1 -0
  269. package/ts_build/src/chat/ChatManager.d.ts +49 -0
  270. package/ts_build/src/chat/ChatManager.js +271 -0
  271. package/ts_build/src/chat/ChatManager.js.map +1 -0
  272. package/ts_build/src/chat/ChatSession.d.ts +32 -0
  273. package/ts_build/src/chat/ChatSession.js +3 -0
  274. package/ts_build/src/chat/ChatSession.js.map +1 -0
  275. package/ts_build/src/chat/ChatSessionManager.d.ts +19 -0
  276. package/ts_build/src/chat/ChatSessionManager.js +188 -0
  277. package/ts_build/src/chat/ChatSessionManager.js.map +1 -0
  278. package/ts_build/src/chat/ChatStateManager.d.ts +58 -0
  279. package/ts_build/src/chat/ChatStateManager.js +156 -0
  280. package/ts_build/src/chat/ChatStateManager.js.map +1 -0
  281. package/ts_build/src/chat/CliChatService.d.ts +35 -0
  282. package/ts_build/src/chat/CliChatService.js +201 -0
  283. package/ts_build/src/chat/CliChatService.js.map +1 -0
  284. package/ts_build/src/chat/InterruptibleInput.d.ts +20 -0
  285. package/ts_build/src/chat/InterruptibleInput.js +109 -0
  286. package/ts_build/src/chat/InterruptibleInput.js.map +1 -0
  287. package/ts_build/src/chat/interfaces/ChatModule.d.ts +6 -0
  288. package/ts_build/src/chat/interfaces/ChatModule.js +3 -0
  289. package/ts_build/src/chat/interfaces/ChatModule.js.map +1 -0
  290. package/ts_build/src/chat/modules/AgentModule.d.ts +57 -0
  291. package/ts_build/src/chat/modules/AgentModule.js +709 -0
  292. package/ts_build/src/chat/modules/AgentModule.js.map +1 -0
  293. package/ts_build/src/chat/modules/AskModule.d.ts +10 -0
  294. package/ts_build/src/chat/modules/AskModule.js +63 -0
  295. package/ts_build/src/chat/modules/AskModule.js.map +1 -0
  296. package/ts_build/src/chat/modules/BaseChatModule.d.ts +14 -0
  297. package/ts_build/src/chat/modules/BaseChatModule.js +32 -0
  298. package/ts_build/src/chat/modules/BaseChatModule.js.map +1 -0
  299. package/ts_build/src/chat/modules/InternalChatModule.d.ts +24 -0
  300. package/ts_build/src/chat/modules/InternalChatModule.js +127 -0
  301. package/ts_build/src/chat/modules/InternalChatModule.js.map +1 -0
  302. package/ts_build/src/chat/modules/SearchModule.d.ts +12 -0
  303. package/ts_build/src/chat/modules/SearchModule.js +119 -0
  304. package/ts_build/src/chat/modules/SearchModule.js.map +1 -0
  305. package/ts_build/src/chat/modules/SetupModule.d.ts +15 -0
  306. package/ts_build/src/chat/modules/SetupModule.js +147 -0
  307. package/ts_build/src/chat/modules/SetupModule.js.map +1 -0
  308. package/ts_build/src/chat/modules/SystemModule.d.ts +14 -0
  309. package/ts_build/src/chat/modules/SystemModule.js +90 -0
  310. package/ts_build/src/chat/modules/SystemModule.js.map +1 -0
  311. package/ts_build/src/chat/modules/VoiceModule.d.ts +11 -0
  312. package/ts_build/src/chat/modules/VoiceModule.js +57 -0
  313. package/ts_build/src/chat/modules/VoiceModule.js.map +1 -0
  314. package/ts_build/src/chat/types.d.ts +83 -0
  315. package/ts_build/src/chat/types.js +3 -0
  316. package/ts_build/src/chat/types.js.map +1 -0
  317. package/ts_build/src/chat.js +7 -1
  318. package/ts_build/src/chat.js.map +1 -1
  319. package/ts_build/src/chat2.d.ts +3 -0
  320. package/ts_build/src/chat2.js +47 -0
  321. package/ts_build/src/chat2.js.map +1 -0
  322. package/ts_build/src/cli.js +218 -37
  323. package/ts_build/src/cli.js.map +1 -1
  324. package/ts_build/src/clients/anthropic.d.ts +5 -2
  325. package/ts_build/src/clients/anthropic.js +12 -7
  326. package/ts_build/src/clients/anthropic.js.map +1 -1
  327. package/ts_build/src/clients/gemini.d.ts +6 -3
  328. package/ts_build/src/clients/gemini.js +13 -7
  329. package/ts_build/src/clients/gemini.js.map +1 -1
  330. package/ts_build/src/clients/http.d.ts +1 -0
  331. package/ts_build/src/clients/http.js +12 -5
  332. package/ts_build/src/clients/http.js.map +1 -1
  333. package/ts_build/src/clients/index.d.ts +10 -0
  334. package/ts_build/src/clients/index.js +74 -4
  335. package/ts_build/src/clients/index.js.map +1 -1
  336. package/ts_build/src/clients/knowhow.d.ts +3 -1
  337. package/ts_build/src/clients/knowhow.js +8 -2
  338. package/ts_build/src/clients/knowhow.js.map +1 -1
  339. package/ts_build/src/clients/knowhowMcp.d.ts +20 -0
  340. package/ts_build/src/clients/knowhowMcp.js +86 -0
  341. package/ts_build/src/clients/knowhowMcp.js.map +1 -0
  342. package/ts_build/src/clients/openai.d.ts +5 -2
  343. package/ts_build/src/clients/openai.js +29 -8
  344. package/ts_build/src/clients/openai.js.map +1 -1
  345. package/ts_build/src/clients/types.d.ts +1 -0
  346. package/ts_build/src/clients/xai.d.ts +5 -2
  347. package/ts_build/src/clients/xai.js +15 -5
  348. package/ts_build/src/clients/xai.js.map +1 -1
  349. package/ts_build/src/config.js +24 -3
  350. package/ts_build/src/config.js.map +1 -1
  351. package/ts_build/src/conversion.js +6 -4
  352. package/ts_build/src/conversion.js.map +1 -1
  353. package/ts_build/src/login.d.ts +1 -1
  354. package/ts_build/src/login.js +21 -7
  355. package/ts_build/src/login.js.map +1 -1
  356. package/ts_build/src/microphone.js.map +1 -1
  357. package/ts_build/src/plugins/downloader/downloader.d.ts +7 -5
  358. package/ts_build/src/plugins/downloader/downloader.js +147 -44
  359. package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
  360. package/ts_build/src/plugins/downloader/plugin.js +5 -3
  361. package/ts_build/src/plugins/downloader/plugin.js.map +1 -1
  362. package/ts_build/src/plugins/plugins.js +3 -0
  363. package/ts_build/src/plugins/plugins.js.map +1 -1
  364. package/ts_build/src/processors/CustomVariables.d.ts +32 -0
  365. package/ts_build/src/processors/CustomVariables.js +297 -0
  366. package/ts_build/src/processors/CustomVariables.js.map +1 -0
  367. package/ts_build/src/processors/HarmonyToolProcessor.d.ts +15 -0
  368. package/ts_build/src/processors/HarmonyToolProcessor.js +154 -0
  369. package/ts_build/src/processors/HarmonyToolProcessor.js.map +1 -0
  370. package/ts_build/src/processors/XmlToolCallProcessor.d.ts +14 -0
  371. package/ts_build/src/processors/XmlToolCallProcessor.js +357 -0
  372. package/ts_build/src/processors/XmlToolCallProcessor.js.map +1 -0
  373. package/ts_build/src/processors/index.d.ts +3 -0
  374. package/ts_build/src/processors/index.js +7 -1
  375. package/ts_build/src/processors/index.js.map +1 -1
  376. package/ts_build/src/prompts/KnowhowConfigExamples.d.ts +2 -0
  377. package/ts_build/src/prompts/KnowhowConfigExamples.js +379 -0
  378. package/ts_build/src/prompts/KnowhowConfigExamples.js.map +1 -0
  379. package/ts_build/src/services/KnowhowClient.d.ts +22 -0
  380. package/ts_build/src/services/KnowhowClient.js +14 -2
  381. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  382. package/ts_build/src/services/Mcp.d.ts +1 -0
  383. package/ts_build/src/services/Mcp.js +20 -3
  384. package/ts_build/src/services/Mcp.js.map +1 -1
  385. package/ts_build/src/services/McpServer.d.ts +1 -1
  386. package/ts_build/src/services/McpServer.js +8 -4
  387. package/ts_build/src/services/McpServer.js.map +1 -1
  388. package/ts_build/src/services/McpWebsocketTransport.js +17 -7
  389. package/ts_build/src/services/McpWebsocketTransport.js.map +1 -1
  390. package/ts_build/src/services/MessageProcessor.d.ts +1 -1
  391. package/ts_build/src/services/MessageProcessor.js +4 -4
  392. package/ts_build/src/services/MessageProcessor.js.map +1 -1
  393. package/ts_build/src/services/index.d.ts +2 -0
  394. package/ts_build/src/services/index.js +4 -0
  395. package/ts_build/src/services/index.js.map +1 -1
  396. package/ts_build/src/services/script-execution/ScriptExecutor.d.ts +1 -0
  397. package/ts_build/src/services/script-execution/ScriptExecutor.js +23 -0
  398. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
  399. package/ts_build/src/services/types.d.ts +2 -6
  400. package/ts_build/src/services/types.js +4 -4
  401. package/ts_build/src/services/types.js.map +1 -1
  402. package/ts_build/src/types.d.ts +11 -0
  403. package/ts_build/src/types.js +8 -0
  404. package/ts_build/src/types.js.map +1 -1
  405. package/ts_build/src/utils/index.d.ts +2 -0
  406. package/ts_build/src/utils/index.js +102 -1
  407. package/ts_build/src/utils/index.js.map +1 -1
  408. package/ts_build/tests/XmlToolCallProcessor.test.d.ts +1 -0
  409. package/ts_build/tests/XmlToolCallProcessor.test.js +376 -0
  410. package/ts_build/tests/XmlToolCallProcessor.test.js.map +1 -0
  411. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +1 -0
  412. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +114 -0
  413. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +1 -0
  414. package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +2 -0
  415. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +104 -0
  416. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +1 -0
  417. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +1 -0
  418. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +74 -0
  419. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +1 -0
  420. package/ts_build/tests/manual/ycmd/simple_test.d.ts +2 -0
  421. package/ts_build/tests/manual/ycmd/simple_test.js +82 -0
  422. package/ts_build/tests/manual/ycmd/simple_test.js.map +1 -0
  423. package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +14 -0
  424. package/ts_build/tests/manual/ycmd/test-typescript-sample.js +20 -0
  425. package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +1 -0
  426. package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +2 -0
  427. package/ts_build/tests/manual/ycmd/test_advanced_features.js +297 -0
  428. package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +1 -0
  429. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +3 -0
  430. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +262 -0
  431. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +1 -0
  432. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +2 -0
  433. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +186 -0
  434. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +1 -0
  435. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +1 -0
  436. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +174 -0
  437. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +1 -0
  438. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +2 -0
  439. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +106 -0
  440. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +1 -0
  441. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +1 -0
  442. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +104 -0
  443. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +1 -0
  444. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +1 -0
  445. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +119 -0
  446. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +1 -0
  447. package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +2 -0
  448. package/ts_build/tests/manual/ycmd/test_discover_commands.js +243 -0
  449. package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +1 -0
  450. package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +2 -0
  451. package/ts_build/tests/manual/ycmd/test_endpoints.js +120 -0
  452. package/ts_build/tests/manual/ycmd/test_endpoints.js.map +1 -0
  453. package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +2 -0
  454. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +221 -0
  455. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +1 -0
  456. package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +2 -0
  457. package/ts_build/tests/manual/ycmd/test_final_validation.js +160 -0
  458. package/ts_build/tests/manual/ycmd/test_final_validation.js.map +1 -0
  459. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +2 -0
  460. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +37 -0
  461. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +1 -0
  462. package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +1 -0
  463. package/ts_build/tests/manual/ycmd/test_server_manager.js +38 -0
  464. package/ts_build/tests/manual/ycmd/test_server_manager.js.map +1 -0
  465. package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +2 -0
  466. package/ts_build/tests/manual/ycmd/test_simple_debug.js +99 -0
  467. package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +1 -0
  468. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +1 -0
  469. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +128 -0
  470. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +1 -0
  471. package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +1 -0
  472. package/ts_build/tests/manual/ycmd/test_typescript_simple.js +66 -0
  473. package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +1 -0
  474. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +1 -0
  475. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +105 -0
  476. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +1 -0
  477. package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +1 -0
  478. package/ts_build/tests/manual/ycmd/test_workspace_config.js +89 -0
  479. package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +1 -0
  480. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +2 -0
  481. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +130 -0
  482. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +1 -0
  483. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +1 -0
  484. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +83 -0
  485. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +1 -0
  486. package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +2 -0
  487. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +149 -0
  488. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +1 -0
  489. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +15 -0
  490. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +58 -0
  491. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +1 -0
  492. package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +2 -0
  493. package/ts_build/tests/manual/ycmd/test_ycmd_final.js +195 -0
  494. package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +1 -0
  495. package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +3 -0
  496. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +110 -0
  497. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +1 -0
  498. package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +2 -0
  499. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +36 -0
  500. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +1 -0
  501. package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +2 -0
  502. package/ts_build/tests/manual/ycmd/working_simple_test.js +134 -0
  503. package/ts_build/tests/manual/ycmd/working_simple_test.js.map +1 -0
  504. package/tsconfig.json +3 -1
@@ -0,0 +1,985 @@
1
+ /**
2
+ * Agent Chat Module - Handles agent interactions
3
+ */
4
+ import { KnowhowSimpleClient } from "../../services/KnowhowClient";
5
+ import * as fs from "fs";
6
+ import * as path from "path";
7
+
8
+ import { formatChatInput } from "../../chat";
9
+ import { BaseChatModule } from "./BaseChatModule";
10
+ import { services } from "../../services/index";
11
+ import { BaseAgent } from "../../agents/index";
12
+ import { ChatCommand, ChatMode, ChatContext, ChatService } from "../types";
13
+ import { ChatInteraction } from "../../types";
14
+ import { Marked } from "../../utils/index";
15
+ import { TokenCompressor } from "../../processors/TokenCompressor";
16
+ import { ToolResponseCache } from "../../processors/ToolResponseCache";
17
+ import {
18
+ CustomVariables,
19
+ XmlToolCallProcessor,
20
+ HarmonyToolProcessor,
21
+ } from "../../processors/index";
22
+ import { TaskInfo, ChatSession } from "../types";
23
+ import { agents } from "../../agents";
24
+
25
+ export class AgentModule extends BaseChatModule {
26
+ name = "agent";
27
+ description = "Agent interaction functionality";
28
+
29
+ // Enhanced task registry for managing agents with metadata
30
+ private taskRegistry = new Map<string, TaskInfo>();
31
+
32
+ // Sessions directory path
33
+ private sessionsDir = "./.knowhow/chats/sessions";
34
+
35
+ constructor() {
36
+ super();
37
+ // Ensure sessions directory exists
38
+ if (!fs.existsSync(this.sessionsDir)) {
39
+ fs.mkdirSync(this.sessionsDir, { recursive: true });
40
+ }
41
+ }
42
+
43
+ getCommands(): ChatCommand[] {
44
+ return [
45
+ {
46
+ name: "agent",
47
+ description: "Start an agent by name",
48
+ handler: this.handleAgentCommand.bind(this),
49
+ },
50
+ {
51
+ name: "agents",
52
+ description: "List available agents",
53
+ handler: this.handleAgentsCommand.bind(this),
54
+ },
55
+ {
56
+ name: "attach",
57
+ description: "Attach to a running session or resume an old session",
58
+ handler: this.handleAttachCommand.bind(this),
59
+ },
60
+ {
61
+ name: "sessions",
62
+ description: "List active tasks and saved sessions",
63
+ handler: this.handleSessionsCommand.bind(this),
64
+ },
65
+ ];
66
+ }
67
+
68
+ getModes(): ChatMode[] {
69
+ return [
70
+ {
71
+ name: "agent",
72
+ description: "Agent interaction mode",
73
+ active: true,
74
+ },
75
+ ];
76
+ }
77
+
78
+ async initialize(service: ChatService): Promise<void> {
79
+ await super.initialize(service);
80
+ await this.handleAgentCommand(["Patcher"]);
81
+ }
82
+
83
+ async handleAgentCommand(args: string[]): Promise<void> {
84
+ const context = this.chatService?.getContext();
85
+
86
+ // If no args provided, toggle agent mode
87
+ if (args.length === 0) {
88
+ if (context?.agentMode) {
89
+ // Disable agent mode
90
+ if (context) {
91
+ context.agentMode = false;
92
+ context.selectedAgent = undefined;
93
+ context.currentAgent = undefined;
94
+ }
95
+ console.log("Agent mode disabled. Switched to chat mode.");
96
+ return;
97
+ } else {
98
+ // Show usage when not in agent mode and no args
99
+ console.log(
100
+ "Agent mode is currently disabled. Use /agent <agent_name> to enable it, or /agents to list available agents."
101
+ );
102
+ return;
103
+ }
104
+ }
105
+
106
+ const agentName = args[0];
107
+ const allAgents = agents();
108
+
109
+ try {
110
+ if (allAgents && allAgents[agentName]) {
111
+ // Set selected agent in context and enable agent mode
112
+ if (context) {
113
+ context.selectedAgent = allAgents[agentName];
114
+ context.agentMode = true;
115
+ context.currentAgent = agentName;
116
+ }
117
+ console.log(
118
+ `Agent mode enabled. Selected agent: ${agentName}. Type your task to get started.`
119
+ );
120
+ } else {
121
+ console.log(
122
+ `Agent "${agentName}" not found. Use /agents to list available agents.`
123
+ );
124
+ }
125
+ } catch (error) {
126
+ console.error(`Error selecting agent ${agentName}:`, error);
127
+ }
128
+ }
129
+
130
+ async handleAttachCommand(args: string[]): Promise<void> {
131
+ if (args.length === 0) {
132
+ // Get both running tasks and saved sessions
133
+ const runningTasks = Array.from(this.taskRegistry.values());
134
+ const savedSessions = await this.listAvailableSessions();
135
+
136
+ if (runningTasks.length === 0 && savedSessions.length === 0) {
137
+ console.log("No active tasks or saved sessions found to attach to.");
138
+ return;
139
+ }
140
+
141
+ // Show available options for selection
142
+ console.log("\n📋 Available Sessions & Tasks:");
143
+ console.log("─".repeat(80));
144
+ console.log(
145
+ "ID".padEnd(25) + "Agent".padEnd(15) + "Status".padEnd(12) + "Type"
146
+ );
147
+ console.log("─".repeat(80));
148
+
149
+ // Show saved sessions
150
+ savedSessions.forEach((session) => {
151
+ console.log(
152
+ session.sessionId.padEnd(25) +
153
+ session.agentName.padEnd(15) +
154
+ session.status.padEnd(12) +
155
+ "saved"
156
+ );
157
+ });
158
+
159
+ // Show running tasks
160
+ runningTasks.forEach((task) => {
161
+ console.log(
162
+ task.taskId.padEnd(25) +
163
+ task.agentName.padEnd(15) +
164
+ task.status.padEnd(12) +
165
+ "running"
166
+ );
167
+ });
168
+
169
+ console.log("─".repeat(80));
170
+
171
+ // Interactive selection for both types
172
+ const allIds = [
173
+ ...savedSessions.map((s) => s.sessionId),
174
+ ...runningTasks.map((t) => t.taskId),
175
+ ];
176
+
177
+ const selectedId = await this.chatService?.getInput(
178
+ "Select a session/task to attach to (or press Enter to skip): ",
179
+ allIds
180
+ );
181
+
182
+ if (
183
+ selectedId &&
184
+ selectedId.trim() &&
185
+ allIds.includes(selectedId.trim())
186
+ ) {
187
+ await this.handleAttachById(selectedId.trim());
188
+ }
189
+ return;
190
+ }
191
+
192
+ const taskId = args[0];
193
+ await this.handleAttachById(taskId);
194
+ }
195
+
196
+ /**
197
+ * Display single task details
198
+ */
199
+ private displaySingleTask(task: TaskInfo): void {
200
+ console.log(`\n📋 Task Details: ${task.taskId}`);
201
+ console.log("─".repeat(50));
202
+ console.log(`Agent: ${task.agentName}`);
203
+ console.log(`Status: ${task.status}`);
204
+ console.log(`Initial Input: ${task.initialInput}`);
205
+ console.log(`Start Time: ${new Date(task.startTime).toLocaleString()}`);
206
+ if (task.endTime) {
207
+ console.log(`End Time: ${new Date(task.endTime).toLocaleString()}`);
208
+ console.log(
209
+ `Duration: ${Math.round((task.endTime - task.startTime) / 1000)}s`
210
+ );
211
+ } else {
212
+ console.log(
213
+ `Running for: ${Math.round((Date.now() - task.startTime) / 1000)}s`
214
+ );
215
+ }
216
+ console.log(`Total Cost: $${task.totalCost.toFixed(3)}`);
217
+ console.log("─".repeat(50));
218
+ }
219
+
220
+ async handleAgentsCommand(args: string[]): Promise<void> {
221
+ try {
222
+ const allAgents = agents();
223
+
224
+ if (allAgents && Object.keys(allAgents).length > 0) {
225
+ const agentNames = Object.keys(allAgents);
226
+
227
+ console.log("\nAvailable agents:");
228
+ Object.entries(allAgents).forEach(([name, agent]: [string, any]) => {
229
+ console.log(` - ${name}: ${agent.description || "No description"}`);
230
+ });
231
+ console.log("─".repeat(80), "\n");
232
+
233
+ // Interactive selection with autocomplete
234
+ const selectedAgent = await this.chatService?.getInput(
235
+ "Select an agent to start: ",
236
+ agentNames // Pass agent names as autocomplete options
237
+ );
238
+
239
+ if (
240
+ selectedAgent &&
241
+ selectedAgent.trim() &&
242
+ agentNames.includes(selectedAgent.trim())
243
+ ) {
244
+ // Start the selected agent
245
+ await this.handleAgentCommand([selectedAgent.trim()]);
246
+ } else if (selectedAgent && selectedAgent.trim()) {
247
+ console.log(`Agent "${selectedAgent.trim()}" not found.`);
248
+ }
249
+ } else {
250
+ console.log("No agents available.");
251
+ }
252
+ } catch (error) {
253
+ console.error("Error listing agents:", error);
254
+ console.log("Could not load agents list.");
255
+ }
256
+ }
257
+
258
+ async logSessionTable() {
259
+ // Display unified table
260
+ const runningTasks = Array.from(this.taskRegistry.values());
261
+ const savedSessions = await this.listAvailableSessions();
262
+ console.log("\n📋 Sessions & Tasks:");
263
+
264
+ const data = [];
265
+ // Display saved sessions first (historical)
266
+ savedSessions.forEach((session) => {
267
+ const lastUpdated = new Date(session.lastUpdated).toLocaleString();
268
+ const inputPreview =
269
+ session.initialInput && session.initialInput.length > 30
270
+ ? session.initialInput.substring(0, 27) + "..."
271
+ : session.initialInput || "[No input]";
272
+ const cost = session.totalCost
273
+ ? `$${session.totalCost.toFixed(3)}`
274
+ : "$0.000";
275
+
276
+ data.push({
277
+ ID: session.sessionId,
278
+ Agent: session.agentName,
279
+ Status: session.status,
280
+ Type: "saved",
281
+ Time: lastUpdated,
282
+ Cost: cost,
283
+ "Initial Input": inputPreview,
284
+ });
285
+ });
286
+
287
+ // Display running tasks at the bottom
288
+ runningTasks.forEach((task) => {
289
+ const elapsed = task.endTime
290
+ ? `${Math.round((task.endTime - task.startTime) / 1000)}s`
291
+ : `${Math.round((Date.now() - task.startTime) / 1000)}s`;
292
+ const cost = `$${task.totalCost.toFixed(3)}`;
293
+ const inputPreview =
294
+ task.initialInput.length > 30
295
+ ? task.initialInput.substring(0, 27) + "..."
296
+ : task.initialInput;
297
+ data.push({
298
+ ID: task.taskId,
299
+ Agent: task.agentName,
300
+ Status: task.status,
301
+ Type: "running",
302
+ Time: elapsed,
303
+ Cost: cost,
304
+ "Initial Input": inputPreview,
305
+ });
306
+ });
307
+
308
+ console.table(data);
309
+ }
310
+
311
+ async handleSessionsCommand(args: string[]): Promise<void> {
312
+ try {
313
+ // Get both running tasks and saved sessions
314
+ const runningTasks = Array.from(this.taskRegistry.values());
315
+ const savedSessions = await this.listAvailableSessions();
316
+
317
+ if (runningTasks.length === 0 && savedSessions.length === 0) {
318
+ console.log("No active tasks or saved sessions found.");
319
+ return;
320
+ }
321
+
322
+ await this.logSessionTable();
323
+
324
+ // Interactive selection for both types
325
+ const allIds = [
326
+ ...savedSessions.map((s) => s.sessionId),
327
+ ...runningTasks.map((t) => t.taskId),
328
+ ];
329
+
330
+ if (allIds.length > 0) {
331
+ const selectedId = await this.chatService?.getInput(
332
+ "Select a session/task to attach to (or press Enter to skip): ",
333
+ allIds
334
+ );
335
+
336
+ if (
337
+ selectedId &&
338
+ selectedId.trim() &&
339
+ allIds.includes(selectedId.trim())
340
+ ) {
341
+ await this.handleAttachById(selectedId.trim());
342
+ }
343
+ }
344
+ } catch (error) {
345
+ console.error("Error listing sessions and tasks:", error);
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Handle attachment by ID - works for both running tasks and saved sessions
351
+ */
352
+ private async handleAttachById(id: string): Promise<void> {
353
+ // Check if it's a running task first
354
+ if (this.taskRegistry.has(id)) {
355
+ const taskInfo = this.taskRegistry.get(id);
356
+ if (taskInfo) {
357
+ // Switch to agent mode and set the selected agent
358
+ const context = this.chatService?.getContext();
359
+ const allAgents = agents();
360
+ const selectedAgent = allAgents[taskInfo.agentName];
361
+
362
+ if (context && selectedAgent) {
363
+ context.selectedAgent = selectedAgent;
364
+ context.agentMode = true;
365
+ context.currentAgent = taskInfo.agentName;
366
+ console.log(`🔄 Switched to agent mode with ${taskInfo.agentName}`);
367
+ console.log(`📋 Attached to running task: ${id}`);
368
+ console.log(`Task: ${taskInfo.initialInput}`);
369
+ console.log(`Status: ${taskInfo.status}`);
370
+ return;
371
+ }
372
+ }
373
+ console.log(Marked.parse(`**Attached to running task: ${id}**`));
374
+ return;
375
+ }
376
+
377
+ // Check if it's a saved session
378
+ try {
379
+ const sessionPath = path.join(this.sessionsDir, `${id}.json`);
380
+ if (fs.existsSync(sessionPath)) {
381
+ console.log(Marked.parse(`**Resuming saved session: ${id}**`));
382
+ // Read session to get agent information
383
+ const content = fs.readFileSync(sessionPath, "utf-8");
384
+ const session: ChatSession = JSON.parse(content);
385
+
386
+ // Switch to agent mode and set the selected agent
387
+ const context = this.chatService?.getContext();
388
+ const allAgents = agents();
389
+ const selectedAgent = allAgents[session.agentName];
390
+
391
+ if (context && selectedAgent) {
392
+ context.selectedAgent = selectedAgent;
393
+ context.agentMode = true;
394
+ console.log(`🔄 Switched to agent mode with ${session.agentName}`);
395
+ console.log(`📋 Resuming saved session: ${id}`);
396
+ console.log(`Original task: ${session.initialInput}`);
397
+ console.log(`Status: ${session.status}`);
398
+
399
+ const addedContext = await this.chatService.getInput(
400
+ "Add any additional context for resuming this session (or press Enter to skip): "
401
+ );
402
+ await this.resumeSession(id);
403
+ return;
404
+ }
405
+ }
406
+ } catch (error) {
407
+ // Session file doesn't exist or error reading it
408
+ }
409
+
410
+ console.log(Marked.parse(`**Session/Task ${id} not found.**`));
411
+ }
412
+
413
+ /**
414
+ * List available session files
415
+ */
416
+ public async listAvailableSessions(): Promise<ChatSession[]> {
417
+ try {
418
+ const files = fs.readdirSync(this.sessionsDir);
419
+ const sessionFiles = files.filter((f) => f.endsWith(".json"));
420
+
421
+ const sessions: ChatSession[] = [];
422
+ const thresholdTime = 15 * 60 * 1000; // 15 minutes
423
+ for (const file of sessionFiles) {
424
+ const filePath = path.join(this.sessionsDir, file);
425
+ try {
426
+ const content = fs.readFileSync(filePath, "utf8");
427
+ const session = JSON.parse(content) as ChatSession;
428
+
429
+ // Cleanup check: mark stale running sessions as failed
430
+ const isStale = Date.now() - session.lastUpdated > thresholdTime;
431
+ const isRunningAndNotInRegistry =
432
+ session.status === "running" &&
433
+ !this.taskRegistry.has(session.sessionId);
434
+
435
+ if (isRunningAndNotInRegistry && isStale) {
436
+ console.log(
437
+ `🧹 Marking stale session ${
438
+ session.sessionId
439
+ } as failed (last updated: ${new Date(
440
+ session.lastUpdated
441
+ ).toLocaleString()})`
442
+ );
443
+ session.status = "failed";
444
+ session.lastUpdated = Date.now();
445
+ // Update the session file with failed status
446
+ fs.writeFileSync(filePath, JSON.stringify(session, null, 2));
447
+ }
448
+
449
+ sessions.push(session);
450
+ } catch (error) {
451
+ console.warn(
452
+ `Failed to read session file ${file}:`,
453
+ (error as Error).message
454
+ );
455
+ }
456
+ }
457
+
458
+ return sessions.sort((a, b) => b.lastUpdated - a.lastUpdated);
459
+ } catch (error) {
460
+ console.warn("Failed to list sessions:", (error as Error).message);
461
+ return [];
462
+ }
463
+ }
464
+
465
+ /**
466
+ * List both active tasks and saved sessions for CLI usage
467
+ */
468
+ public async listSessionsAndTasks(): Promise<{
469
+ runningTasks: TaskInfo[];
470
+ savedSessions: ChatSession[];
471
+ }> {
472
+ const runningTasks = Array.from(this.taskRegistry.values());
473
+ const savedSessions = await this.listAvailableSessions();
474
+ return {
475
+ runningTasks,
476
+ savedSessions,
477
+ };
478
+ }
479
+
480
+ /**
481
+ * Get the task registry for CLI access
482
+ */
483
+ public getTaskRegistry(): Map<string, TaskInfo> {
484
+ return this.taskRegistry;
485
+ }
486
+
487
+ /**
488
+ * Resume a session from saved state
489
+ */
490
+ private async resumeSession(
491
+ sessionId: string,
492
+ resumeReason?: string
493
+ ): Promise<void> {
494
+ try {
495
+ const sessionPath = path.join(this.sessionsDir, `${sessionId}.json`);
496
+ const content = fs.readFileSync(sessionPath, "utf-8");
497
+ const session: ChatSession = JSON.parse(content);
498
+ const lastThread = session.threads[session.threads.length - 1];
499
+ console.log(`\n🔄 Resuming session: ${sessionId}`);
500
+ console.log(`Agent: ${session.agentName}`);
501
+ console.log(`Original task: ${session.initialInput}`);
502
+ console.log(`Status: ${session.status}`);
503
+
504
+ const reason = resumeReason
505
+ ? `Reason for resuming: ${resumeReason}`
506
+ : "";
507
+
508
+ // Create resume prompt
509
+ const resumePrompt = `You are resuming a previously started task. Here's the context:
510
+ ORIGINAL REQUEST:
511
+ ${session.initialInput}
512
+
513
+ LAST Progress State:
514
+ ${JSON.stringify(lastThread)}
515
+
516
+ Please continue from where you left off and complete the original request.
517
+ ${reason}
518
+
519
+ `;
520
+
521
+ console.log("🚀 Session resumption would restart the agent here...");
522
+ const context = this.chatService?.getContext() || {};
523
+ const allAgents = agents();
524
+ const selectedAgent =
525
+ allAgents[session.agentName] || allAgents[context.currentAgent];
526
+
527
+ if (!selectedAgent) {
528
+ console.error(`Agent ${session.agentName} not found.`);
529
+ return;
530
+ }
531
+
532
+ // Start agent with Knowhow task context if available
533
+ const { agent, taskId } = await this.setupAgent({
534
+ agentName: selectedAgent.name,
535
+ input: resumePrompt,
536
+ messageId: session.knowhowMessageId,
537
+ existingKnowhowTaskId: session.knowhowTaskId,
538
+ chatHistory: [],
539
+ run: true,
540
+ });
541
+ await this.attachedAgentChatLoop(taskId, agent);
542
+ } catch (error) {
543
+ console.error(
544
+ `Failed to resume session ${sessionId}:`,
545
+ (error as Error).message
546
+ );
547
+ }
548
+ }
549
+
550
+ async handleInput(input: string, context: ChatContext): Promise<boolean> {
551
+ // If in agent mode, start agent with the input as initial task (like original chat.ts)
552
+ if (context.agentMode && context.selectedAgent) {
553
+ const result = await this.startAgent(
554
+ context.selectedAgent,
555
+ input,
556
+ context.chatHistory || []
557
+ );
558
+ return result;
559
+ }
560
+ return false;
561
+ }
562
+
563
+ /**
564
+ * Setup and run an agent directly with CLI options (for CLI usage)
565
+ */
566
+ public async setupAgent(options: {
567
+ agentName: string;
568
+ input: string;
569
+ messageId?: string;
570
+ existingKnowhowTaskId?: string;
571
+ provider?: string;
572
+ model?: string;
573
+ maxTimeLimit?: number; // in minutes
574
+ maxSpendLimit?: number; // in dollars
575
+ chatHistory?: ChatInteraction[];
576
+ run?: boolean; // whether to run immediately
577
+ }) {
578
+ const allAgents = agents();
579
+
580
+ if (!allAgents[options.agentName]) {
581
+ throw new Error(
582
+ `Agent "${
583
+ options.agentName
584
+ }" not found. Available agents: ${Object.keys(allAgents).join(", ")}`
585
+ );
586
+ }
587
+
588
+ const { input, chatHistory = [], agentName } = options;
589
+ const agent = allAgents[options.agentName] as BaseAgent;
590
+
591
+ let done = false;
592
+ let output = "Done";
593
+ const taskId = this.generateTaskId(input);
594
+ let knowhowTaskId: string | undefined;
595
+
596
+ try {
597
+ // Create task info object
598
+ let taskInfo: TaskInfo = {
599
+ taskId,
600
+ knowhowMessageId: options.messageId,
601
+ knowhowTaskId: options.existingKnowhowTaskId, // Use existing or will be set after creating chat task
602
+ agentName,
603
+ agent,
604
+ initialInput: input,
605
+ status: "running",
606
+ startTime: Date.now(),
607
+ totalCost: 0,
608
+ };
609
+
610
+ // Add to task registry
611
+ this.taskRegistry.set(taskId, taskInfo);
612
+
613
+ // Save initial session
614
+ this.saveSession(taskId, taskInfo, []);
615
+
616
+ // Create Knowhow chat task if messageId provided
617
+ const baseUrl = process.env.KNOWHOW_API_URL;
618
+ console.log(
619
+ `Base URL for Knowhow API: ${baseUrl}, Message ID: ${options.messageId}`
620
+ );
621
+ const client = new KnowhowSimpleClient(baseUrl);
622
+ if (options.messageId && !options.existingKnowhowTaskId && baseUrl) {
623
+ try {
624
+ const response = await client.createChatTask({
625
+ messageId: options.messageId,
626
+ prompt: input,
627
+ });
628
+ knowhowTaskId = response.data.id;
629
+ console.log(`✅ Created Knowhow chat task: ${knowhowTaskId}`);
630
+
631
+ // Update TaskInfo with the created knowhowTaskId
632
+ taskInfo.knowhowTaskId = knowhowTaskId;
633
+ this.taskRegistry.set(taskId, taskInfo);
634
+ } catch (error) {
635
+ console.error(`❌ Failed to create Knowhow chat task:`, error);
636
+ // Continue execution even if task creation fails
637
+ }
638
+ }
639
+
640
+ // Set up session update listener
641
+ agent.agentEvents.on("threadUpdate", async (threadState) => {
642
+ // Update task cost from agent's current total cost
643
+ taskInfo.totalCost = agent.getTotalCostUsd();
644
+ this.updateSession(taskId, threadState);
645
+
646
+ // Update Knowhow chat task if created
647
+ if (knowhowTaskId && options.messageId && baseUrl) {
648
+ await client
649
+ .updateChatTask(knowhowTaskId, {
650
+ threads: agent.getThreads(),
651
+ totalCostUsd: agent.getTotalCostUsd(),
652
+ inProgress: true,
653
+ })
654
+ .catch((error) => {
655
+ console.error(`❌ Failed to update Knowhow chat task:`, error);
656
+ });
657
+ console.log(`✅ Updated Knowhow chat task: ${knowhowTaskId}`);
658
+ }
659
+ });
660
+
661
+ console.log(
662
+ Marked.parse(`**Starting ${agent.name} with task ID: ${taskId}...**`)
663
+ );
664
+ console.log(Marked.parse(`**Task:** ${input}`));
665
+
666
+ // Initialize new task
667
+ await agent.newTask();
668
+
669
+ // Get context for plugins
670
+ const context = this.chatService?.getContext();
671
+ const plugins = context?.plugins || [];
672
+
673
+ // Format the prompt with plugins and chat history
674
+ const formattedPrompt = await formatChatInput(
675
+ input,
676
+ plugins,
677
+ chatHistory
678
+ );
679
+
680
+ // Set up message processors like in original startAgent
681
+
682
+ agent.messageProcessor.setProcessors("pre_call", [
683
+ new ToolResponseCache(agent.tools).createProcessor(),
684
+ new TokenCompressor(agent.tools).createProcessor((msg) =>
685
+ Boolean(msg.role === "tool" && msg.tool_call_id)
686
+ ),
687
+ new CustomVariables(agent.tools).createProcessor(),
688
+ ]);
689
+
690
+ agent.messageProcessor.setProcessors("post_call", [
691
+ new XmlToolCallProcessor().createProcessor(),
692
+ new HarmonyToolProcessor().createProcessor(),
693
+ ]);
694
+
695
+ // Set up event listeners
696
+ if (!agent.agentEvents.listenerCount(agent.eventTypes.toolUsed)) {
697
+ agent.agentEvents.on(agent.eventTypes.toolUsed, (responseMsg) => {
698
+ console.log(` 🔨 Tool used: ${JSON.stringify(responseMsg, null, 2)}`);
699
+ });
700
+ }
701
+
702
+ const taskCompleted = new Promise<string>((resolve) => {
703
+ agent.agentEvents.once(agent.eventTypes.done, async (doneMsg) => {
704
+ console.log("Agent has finished.");
705
+ done = true;
706
+ output = doneMsg || "No response from the AI";
707
+ // Update task info
708
+ taskInfo = this.taskRegistry.get(taskId);
709
+ if (taskInfo) {
710
+ taskInfo.status = "completed";
711
+ // Update final cost from agent
712
+ taskInfo.totalCost = agent.getTotalCostUsd();
713
+ // Update session with final state
714
+ this.updateSession(taskId, agent.getThreads());
715
+ taskInfo.endTime = Date.now();
716
+
717
+ // Final update to Knowhow chat task
718
+ if (knowhowTaskId && options.messageId) {
719
+ console.log(
720
+ `Updating Knowhow chat task on completion..., ${knowhowTaskId}, ${options.messageId}`
721
+ );
722
+ await client
723
+ .updateChatTask(knowhowTaskId, {
724
+ inProgress: false,
725
+ threads: agent.getThreads(),
726
+ totalCostUsd: agent.getTotalCostUsd(),
727
+ result: output,
728
+ })
729
+ .catch((error) => {
730
+ console.error(
731
+ `❌ Failed to update Knowhow chat task on completion:`,
732
+ error
733
+ );
734
+ });
735
+ console.log(`✅ Completed Knowhow chat task: ${knowhowTaskId}`);
736
+ }
737
+ }
738
+ console.log(Marked.parse(output));
739
+ resolve(doneMsg);
740
+ });
741
+ });
742
+
743
+ // Set up time limit if provided
744
+ if (options.maxTimeLimit) {
745
+ agent.setMaxRunTime(options.maxTimeLimit * 60 * 1000); // Convert minutes to milliseconds
746
+ }
747
+
748
+ console.log(`🤖 Starting agent: ${options.agentName}`);
749
+ console.log(`📝 Task: ${options.input}`);
750
+
751
+ if (options.maxTimeLimit) {
752
+ console.log(`⏱️ Time limit: ${options.maxTimeLimit} minutes`);
753
+ }
754
+ if (options.maxSpendLimit) {
755
+ console.log(`💰 Spend limit: $${options.maxSpendLimit}`);
756
+ }
757
+ console.log("─".repeat(50));
758
+
759
+ if (options.run) {
760
+ agent.call(formattedPrompt);
761
+ }
762
+
763
+ return { agent, taskId, formattedPrompt, taskCompleted };
764
+ } catch (error) {
765
+ console.error("Agent setup failed:", error);
766
+ this.taskRegistry.delete(taskId);
767
+ }
768
+ }
769
+
770
+ /**
771
+ * Get list of active agent tasks
772
+ */
773
+ getActiveTasks(): { taskId: string; agent: TaskInfo }[] {
774
+ return Array.from(this.taskRegistry.entries()).map(
775
+ ([taskId, taskInfo]) => ({
776
+ taskId,
777
+ agent: taskInfo,
778
+ })
779
+ );
780
+ }
781
+
782
+ /**
783
+ * Attach to an existing agent task
784
+ */
785
+ attachToTask(taskId: string): boolean {
786
+ if (this.taskRegistry.has(taskId)) {
787
+ console.log(Marked.parse(`**Attached to agent task: ${taskId}**`));
788
+ return true;
789
+ }
790
+ console.log(
791
+ Marked.parse(`**Task ${taskId} not found or already completed.**`)
792
+ );
793
+ return false;
794
+ }
795
+
796
+ /**
797
+ * Generate human-readable task ID from initial input
798
+ */
799
+ private generateTaskId(initialInput: string): string {
800
+ const words = initialInput
801
+ .toLowerCase()
802
+ .replace(/[^\w\s]/g, "")
803
+ .split(/\s+/)
804
+ .filter((word) => word.length > 2)
805
+ .slice(0, 3);
806
+
807
+ const wordPart = words.join("-") || "task";
808
+ const timestamp = Date.now().toString().slice(-6);
809
+ return `${wordPart}-${timestamp}`;
810
+ }
811
+
812
+ /**
813
+ * Save session to file
814
+ */
815
+ private saveSession(
816
+ taskId: string,
817
+ taskInfo: TaskInfo,
818
+ threads: any[]
819
+ ): void {
820
+ try {
821
+ const sessionPath = path.join(this.sessionsDir, `${taskId}.json`);
822
+ const session: ChatSession = {
823
+ sessionId: taskId,
824
+ knowhowMessageId: taskInfo.knowhowMessageId,
825
+ knowhowTaskId: taskInfo.knowhowTaskId,
826
+ taskId,
827
+ agentName: taskInfo.agentName,
828
+ initialInput: taskInfo.initialInput,
829
+ status: taskInfo.status,
830
+ startTime: taskInfo.startTime,
831
+ endTime: taskInfo.endTime,
832
+ totalCost: taskInfo.totalCost,
833
+ threads,
834
+ currentThread: 0,
835
+ lastUpdated: Date.now(),
836
+ };
837
+
838
+ fs.writeFileSync(sessionPath, JSON.stringify(session, null, 2));
839
+ } catch (error) {
840
+ console.error(`Error saving session ${taskId}:`, error);
841
+ }
842
+ }
843
+
844
+ /**
845
+ * Update existing session with new thread state
846
+ */
847
+ private updateSession(taskId: string, threads: any[]): void {
848
+ try {
849
+ const sessionPath = path.join(this.sessionsDir, `${taskId}.json`);
850
+ if (fs.existsSync(sessionPath)) {
851
+ const session: ChatSession = JSON.parse(
852
+ fs.readFileSync(sessionPath, "utf8")
853
+ );
854
+ const taskInfo = this.taskRegistry.get(taskId);
855
+
856
+ // Update session with current state
857
+ session.threads = threads;
858
+ session.lastUpdated = Date.now();
859
+ if (taskInfo) {
860
+ session.status = taskInfo.status;
861
+ session.endTime = taskInfo.endTime;
862
+ session.totalCost = taskInfo.totalCost;
863
+
864
+ // Update Knowhow task fields if they exist in TaskInfo
865
+ session.knowhowMessageId = taskInfo.knowhowMessageId;
866
+ session.knowhowTaskId = taskInfo.knowhowTaskId;
867
+ }
868
+
869
+ fs.writeFileSync(sessionPath, JSON.stringify(session, null, 2));
870
+ }
871
+ } catch (error) {
872
+ console.error(`Error updating session ${taskId}:`, error);
873
+ }
874
+ }
875
+
876
+ /**
877
+ * Start an agent with an initial task (simplified version for now)
878
+ */
879
+ private async startAgent(
880
+ selectedAgent: BaseAgent,
881
+ initialInput: string,
882
+ chatHistory: ChatInteraction[] = []
883
+ ): Promise<boolean> {
884
+ try {
885
+ const { agent, taskId } = await this.setupAgent({
886
+ agentName: selectedAgent.name,
887
+ input: initialInput,
888
+ chatHistory,
889
+ run: true,
890
+ });
891
+ return await this.attachedAgentChatLoop(taskId, agent);
892
+ } catch (error) {
893
+ console.error("Error starting agent:", error);
894
+ return false;
895
+ }
896
+ }
897
+
898
+ async attachedAgentChatLoop(taskId: string, agent: BaseAgent) {
899
+ try {
900
+ let done = false;
901
+ let output = "Done";
902
+
903
+ // Define available commands
904
+ const commands = ["pause", "unpause", "kill", "detach"];
905
+ const history: string[] = [];
906
+
907
+ let input =
908
+ (await this.chatService?.getInput(
909
+ `Enter command or message for ${agent.name}: `,
910
+ commands
911
+ )) || "";
912
+
913
+ history.push(input);
914
+
915
+ let finished = false;
916
+ const donePromise = new Promise<string>((resolve) => {
917
+ agent.agentEvents.once(agent.eventTypes.done, (doneMsg) => {
918
+ console.log("Agent has completed the task.");
919
+ finished = true;
920
+ resolve("done");
921
+ });
922
+ });
923
+
924
+ while (!done) {
925
+ switch (input) {
926
+ case "":
927
+ if (finished) {
928
+ output = "Agent has completed the task.";
929
+ done = true;
930
+ }
931
+ break;
932
+ case "done":
933
+ output = "Exited agent interaction.";
934
+ done = true;
935
+ break;
936
+ case "pause":
937
+ await agent.pause();
938
+ console.log("Agent paused.");
939
+ break;
940
+ case "unpause":
941
+ await agent.unpause();
942
+ console.log("Agent unpaused.");
943
+ break;
944
+ case "kill":
945
+ await agent.kill();
946
+ console.log("Agent terminated.");
947
+ done = true;
948
+ break;
949
+ case "detach":
950
+ console.log("Detached from agent");
951
+ return true;
952
+ default:
953
+ agent.addPendingUserMessage({
954
+ role: "user",
955
+ content: input,
956
+ });
957
+ }
958
+
959
+ if (!done) {
960
+ input = await this.chatService?.getInput(
961
+ `Enter command or message for ${agent.name}: `,
962
+ commands
963
+ );
964
+ }
965
+ }
966
+
967
+ // Update final task status and save session
968
+ const finalTaskInfo = this.taskRegistry.get(taskId);
969
+ if (finalTaskInfo) {
970
+ if (finalTaskInfo.status === "running") {
971
+ finalTaskInfo.status = "completed";
972
+ // Ensure final cost is captured
973
+ finalTaskInfo.totalCost = agent.getTotalCostUsd();
974
+ finalTaskInfo.endTime = Date.now();
975
+ }
976
+ }
977
+
978
+ return true;
979
+ } catch (error) {
980
+ console.error("Agent execution failed:", error);
981
+ this.taskRegistry.delete(taskId);
982
+ return false;
983
+ }
984
+ }
985
+ }