atena-cli 0.1.0

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 (475) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +210 -0
  3. package/dist/agent.d.ts +44 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +731 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/agents.d.ts +33 -0
  8. package/dist/agents.d.ts.map +1 -0
  9. package/dist/agents.js +162 -0
  10. package/dist/agents.js.map +1 -0
  11. package/dist/autocomplete.d.ts +4 -0
  12. package/dist/autocomplete.d.ts.map +1 -0
  13. package/dist/autocomplete.js +96 -0
  14. package/dist/autocomplete.js.map +1 -0
  15. package/dist/cli/commands/connect.d.ts +3 -0
  16. package/dist/cli/commands/connect.d.ts.map +1 -0
  17. package/dist/cli/commands/connect.js +31 -0
  18. package/dist/cli/commands/connect.js.map +1 -0
  19. package/dist/cli/commands/deploy.d.ts +3 -0
  20. package/dist/cli/commands/deploy.d.ts.map +1 -0
  21. package/dist/cli/commands/deploy.js +26 -0
  22. package/dist/cli/commands/deploy.js.map +1 -0
  23. package/dist/cli/commands/login.d.ts +3 -0
  24. package/dist/cli/commands/login.d.ts.map +1 -0
  25. package/dist/cli/commands/login.js +46 -0
  26. package/dist/cli/commands/login.js.map +1 -0
  27. package/dist/cli/commands/vault.d.ts +3 -0
  28. package/dist/cli/commands/vault.d.ts.map +1 -0
  29. package/dist/cli/commands/vault.js +73 -0
  30. package/dist/cli/commands/vault.js.map +1 -0
  31. package/dist/cli/index.d.ts +3 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +309 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/cli/init/setup.d.ts +3 -0
  36. package/dist/cli/init/setup.d.ts.map +1 -0
  37. package/dist/cli/init/setup.js +74 -0
  38. package/dist/cli/init/setup.js.map +1 -0
  39. package/dist/cli/menus.d.ts +2 -0
  40. package/dist/cli/menus.d.ts.map +1 -0
  41. package/dist/cli/menus.js +111 -0
  42. package/dist/cli/menus.js.map +1 -0
  43. package/dist/cli/postinstall.d.ts +9 -0
  44. package/dist/cli/postinstall.d.ts.map +1 -0
  45. package/dist/cli/postinstall.js +81 -0
  46. package/dist/cli/postinstall.js.map +1 -0
  47. package/dist/cli/realtime-input.d.ts +4 -0
  48. package/dist/cli/realtime-input.d.ts.map +1 -0
  49. package/dist/cli/realtime-input.js +268 -0
  50. package/dist/cli/realtime-input.js.map +1 -0
  51. package/dist/cli/setup.d.ts +26 -0
  52. package/dist/cli/setup.d.ts.map +1 -0
  53. package/dist/cli/setup.js +202 -0
  54. package/dist/cli/setup.js.map +1 -0
  55. package/dist/cli/themes.d.ts +30 -0
  56. package/dist/cli/themes.d.ts.map +1 -0
  57. package/dist/cli/themes.js +225 -0
  58. package/dist/cli/themes.js.map +1 -0
  59. package/dist/cli/ui.d.ts +70 -0
  60. package/dist/cli/ui.d.ts.map +1 -0
  61. package/dist/cli/ui.js +455 -0
  62. package/dist/cli/ui.js.map +1 -0
  63. package/dist/commands.d.ts +16 -0
  64. package/dist/commands.d.ts.map +1 -0
  65. package/dist/commands.js +230 -0
  66. package/dist/commands.js.map +1 -0
  67. package/dist/config.d.ts +42 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +140 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/context.d.ts +23 -0
  72. package/dist/context.d.ts.map +1 -0
  73. package/dist/context.js +80 -0
  74. package/dist/context.js.map +1 -0
  75. package/dist/core/agent.d.ts +94 -0
  76. package/dist/core/agent.d.ts.map +1 -0
  77. package/dist/core/agent.js +1280 -0
  78. package/dist/core/agent.js.map +1 -0
  79. package/dist/core/agents/enterprise/backend.d.ts +3 -0
  80. package/dist/core/agents/enterprise/backend.d.ts.map +1 -0
  81. package/dist/core/agents/enterprise/backend.js +35 -0
  82. package/dist/core/agents/enterprise/backend.js.map +1 -0
  83. package/dist/core/agents/enterprise/cloud.d.ts +3 -0
  84. package/dist/core/agents/enterprise/cloud.d.ts.map +1 -0
  85. package/dist/core/agents/enterprise/cloud.js +35 -0
  86. package/dist/core/agents/enterprise/cloud.js.map +1 -0
  87. package/dist/core/agents/enterprise/datascience.d.ts +3 -0
  88. package/dist/core/agents/enterprise/datascience.d.ts.map +1 -0
  89. package/dist/core/agents/enterprise/datascience.js +35 -0
  90. package/dist/core/agents/enterprise/datascience.js.map +1 -0
  91. package/dist/core/agents/enterprise/design.d.ts +3 -0
  92. package/dist/core/agents/enterprise/design.d.ts.map +1 -0
  93. package/dist/core/agents/enterprise/design.js +35 -0
  94. package/dist/core/agents/enterprise/design.js.map +1 -0
  95. package/dist/core/agents/enterprise/devops.d.ts +3 -0
  96. package/dist/core/agents/enterprise/devops.d.ts.map +1 -0
  97. package/dist/core/agents/enterprise/devops.js +35 -0
  98. package/dist/core/agents/enterprise/devops.js.map +1 -0
  99. package/dist/core/agents/enterprise/finance.d.ts +3 -0
  100. package/dist/core/agents/enterprise/finance.d.ts.map +1 -0
  101. package/dist/core/agents/enterprise/finance.js +35 -0
  102. package/dist/core/agents/enterprise/finance.js.map +1 -0
  103. package/dist/core/agents/enterprise/frontend.d.ts +3 -0
  104. package/dist/core/agents/enterprise/frontend.d.ts.map +1 -0
  105. package/dist/core/agents/enterprise/frontend.js +35 -0
  106. package/dist/core/agents/enterprise/frontend.js.map +1 -0
  107. package/dist/core/agents/enterprise/hr.d.ts +3 -0
  108. package/dist/core/agents/enterprise/hr.d.ts.map +1 -0
  109. package/dist/core/agents/enterprise/hr.js +35 -0
  110. package/dist/core/agents/enterprise/hr.js.map +1 -0
  111. package/dist/core/agents/enterprise/index.d.ts +4 -0
  112. package/dist/core/agents/enterprise/index.d.ts.map +1 -0
  113. package/dist/core/agents/enterprise/index.js +44 -0
  114. package/dist/core/agents/enterprise/index.js.map +1 -0
  115. package/dist/core/agents/enterprise/legal.d.ts +3 -0
  116. package/dist/core/agents/enterprise/legal.d.ts.map +1 -0
  117. package/dist/core/agents/enterprise/legal.js +35 -0
  118. package/dist/core/agents/enterprise/legal.js.map +1 -0
  119. package/dist/core/agents/enterprise/marketing.d.ts +3 -0
  120. package/dist/core/agents/enterprise/marketing.d.ts.map +1 -0
  121. package/dist/core/agents/enterprise/marketing.js +35 -0
  122. package/dist/core/agents/enterprise/marketing.js.map +1 -0
  123. package/dist/core/agents/enterprise/pm.d.ts +3 -0
  124. package/dist/core/agents/enterprise/pm.d.ts.map +1 -0
  125. package/dist/core/agents/enterprise/pm.js +35 -0
  126. package/dist/core/agents/enterprise/pm.js.map +1 -0
  127. package/dist/core/agents/enterprise/product.d.ts +3 -0
  128. package/dist/core/agents/enterprise/product.d.ts.map +1 -0
  129. package/dist/core/agents/enterprise/product.js +35 -0
  130. package/dist/core/agents/enterprise/product.js.map +1 -0
  131. package/dist/core/agents/enterprise/qa.d.ts +3 -0
  132. package/dist/core/agents/enterprise/qa.d.ts.map +1 -0
  133. package/dist/core/agents/enterprise/qa.js +35 -0
  134. package/dist/core/agents/enterprise/qa.js.map +1 -0
  135. package/dist/core/agents/enterprise/sales.d.ts +3 -0
  136. package/dist/core/agents/enterprise/sales.d.ts.map +1 -0
  137. package/dist/core/agents/enterprise/sales.js +35 -0
  138. package/dist/core/agents/enterprise/sales.js.map +1 -0
  139. package/dist/core/agents/enterprise/security.d.ts +3 -0
  140. package/dist/core/agents/enterprise/security.d.ts.map +1 -0
  141. package/dist/core/agents/enterprise/security.js +36 -0
  142. package/dist/core/agents/enterprise/security.js.map +1 -0
  143. package/dist/core/agents/enterprise/support.d.ts +3 -0
  144. package/dist/core/agents/enterprise/support.d.ts.map +1 -0
  145. package/dist/core/agents/enterprise/support.js +35 -0
  146. package/dist/core/agents/enterprise/support.js.map +1 -0
  147. package/dist/core/agents.d.ts +84 -0
  148. package/dist/core/agents.d.ts.map +1 -0
  149. package/dist/core/agents.js +266 -0
  150. package/dist/core/agents.js.map +1 -0
  151. package/dist/core/analytics.d.ts +21 -0
  152. package/dist/core/analytics.d.ts.map +1 -0
  153. package/dist/core/analytics.js +57 -0
  154. package/dist/core/analytics.js.map +1 -0
  155. package/dist/core/auth.d.ts +43 -0
  156. package/dist/core/auth.d.ts.map +1 -0
  157. package/dist/core/auth.js +110 -0
  158. package/dist/core/auth.js.map +1 -0
  159. package/dist/core/code_indexer.d.ts +14 -0
  160. package/dist/core/code_indexer.d.ts.map +1 -0
  161. package/dist/core/code_indexer.js +52 -0
  162. package/dist/core/code_indexer.js.map +1 -0
  163. package/dist/core/commands.d.ts +16 -0
  164. package/dist/core/commands.d.ts.map +1 -0
  165. package/dist/core/commands.js +285 -0
  166. package/dist/core/commands.js.map +1 -0
  167. package/dist/core/consensus.d.ts +25 -0
  168. package/dist/core/consensus.d.ts.map +1 -0
  169. package/dist/core/consensus.js +49 -0
  170. package/dist/core/consensus.js.map +1 -0
  171. package/dist/core/context.d.ts +23 -0
  172. package/dist/core/context.d.ts.map +1 -0
  173. package/dist/core/context.js +82 -0
  174. package/dist/core/context.js.map +1 -0
  175. package/dist/core/eden-ai-sdk.d.ts +11 -0
  176. package/dist/core/eden-ai-sdk.d.ts.map +1 -0
  177. package/dist/core/eden-ai-sdk.js +158 -0
  178. package/dist/core/eden-ai-sdk.js.map +1 -0
  179. package/dist/core/events.d.ts +64 -0
  180. package/dist/core/events.d.ts.map +1 -0
  181. package/dist/core/events.js +18 -0
  182. package/dist/core/events.js.map +1 -0
  183. package/dist/core/groq-client.d.ts +7 -0
  184. package/dist/core/groq-client.d.ts.map +1 -0
  185. package/dist/core/groq-client.js +112 -0
  186. package/dist/core/groq-client.js.map +1 -0
  187. package/dist/core/mcp.d.ts +51 -0
  188. package/dist/core/mcp.d.ts.map +1 -0
  189. package/dist/core/mcp.js +201 -0
  190. package/dist/core/mcp.js.map +1 -0
  191. package/dist/core/memory.d.ts +20 -0
  192. package/dist/core/memory.d.ts.map +1 -0
  193. package/dist/core/memory.js +61 -0
  194. package/dist/core/memory.js.map +1 -0
  195. package/dist/core/model-profiles.d.ts +62 -0
  196. package/dist/core/model-profiles.d.ts.map +1 -0
  197. package/dist/core/model-profiles.js +841 -0
  198. package/dist/core/model-profiles.js.map +1 -0
  199. package/dist/core/moonshot-client.d.ts +7 -0
  200. package/dist/core/moonshot-client.d.ts.map +1 -0
  201. package/dist/core/moonshot-client.js +102 -0
  202. package/dist/core/moonshot-client.js.map +1 -0
  203. package/dist/core/nexus.d.ts +16 -0
  204. package/dist/core/nexus.d.ts.map +1 -0
  205. package/dist/core/nexus.js +31 -0
  206. package/dist/core/nexus.js.map +1 -0
  207. package/dist/core/notifications.d.ts +16 -0
  208. package/dist/core/notifications.d.ts.map +1 -0
  209. package/dist/core/notifications.js +26 -0
  210. package/dist/core/notifications.js.map +1 -0
  211. package/dist/core/ollama-client.d.ts +16 -0
  212. package/dist/core/ollama-client.d.ts.map +1 -0
  213. package/dist/core/ollama-client.js +138 -0
  214. package/dist/core/ollama-client.js.map +1 -0
  215. package/dist/core/orchestrator.d.ts +96 -0
  216. package/dist/core/orchestrator.d.ts.map +1 -0
  217. package/dist/core/orchestrator.js +801 -0
  218. package/dist/core/orchestrator.js.map +1 -0
  219. package/dist/core/permissions.d.ts +34 -0
  220. package/dist/core/permissions.d.ts.map +1 -0
  221. package/dist/core/permissions.js +224 -0
  222. package/dist/core/permissions.js.map +1 -0
  223. package/dist/core/providers.d.ts +22 -0
  224. package/dist/core/providers.d.ts.map +1 -0
  225. package/dist/core/providers.js +81 -0
  226. package/dist/core/providers.js.map +1 -0
  227. package/dist/core/researcher.d.ts +24 -0
  228. package/dist/core/researcher.d.ts.map +1 -0
  229. package/dist/core/researcher.js +97 -0
  230. package/dist/core/researcher.js.map +1 -0
  231. package/dist/core/sandbox.d.ts +22 -0
  232. package/dist/core/sandbox.d.ts.map +1 -0
  233. package/dist/core/sandbox.js +79 -0
  234. package/dist/core/sandbox.js.map +1 -0
  235. package/dist/core/scavenger.d.ts +5 -0
  236. package/dist/core/scavenger.d.ts.map +1 -0
  237. package/dist/core/scavenger.js +51 -0
  238. package/dist/core/scavenger.js.map +1 -0
  239. package/dist/core/server.d.ts +21 -0
  240. package/dist/core/server.d.ts.map +1 -0
  241. package/dist/core/server.js +776 -0
  242. package/dist/core/server.js.map +1 -0
  243. package/dist/core/sessions.d.ts +54 -0
  244. package/dist/core/sessions.d.ts.map +1 -0
  245. package/dist/core/sessions.js +182 -0
  246. package/dist/core/sessions.js.map +1 -0
  247. package/dist/core/setup.d.ts +12 -0
  248. package/dist/core/setup.d.ts.map +1 -0
  249. package/dist/core/setup.js +70 -0
  250. package/dist/core/setup.js.map +1 -0
  251. package/dist/core/skills.d.ts +17 -0
  252. package/dist/core/skills.d.ts.map +1 -0
  253. package/dist/core/skills.js +123 -0
  254. package/dist/core/skills.js.map +1 -0
  255. package/dist/core/stats.d.ts +54 -0
  256. package/dist/core/stats.d.ts.map +1 -0
  257. package/dist/core/stats.js +221 -0
  258. package/dist/core/stats.js.map +1 -0
  259. package/dist/core/swarm_manager.d.ts +20 -0
  260. package/dist/core/swarm_manager.d.ts.map +1 -0
  261. package/dist/core/swarm_manager.js +48 -0
  262. package/dist/core/swarm_manager.js.map +1 -0
  263. package/dist/core/system.d.ts +39 -0
  264. package/dist/core/system.d.ts.map +1 -0
  265. package/dist/core/system.js +129 -0
  266. package/dist/core/system.js.map +1 -0
  267. package/dist/core/tasks.d.ts +24 -0
  268. package/dist/core/tasks.d.ts.map +1 -0
  269. package/dist/core/tasks.js +66 -0
  270. package/dist/core/tasks.js.map +1 -0
  271. package/dist/core/telegram.d.ts +9 -0
  272. package/dist/core/telegram.d.ts.map +1 -0
  273. package/dist/core/telegram.js +49 -0
  274. package/dist/core/telegram.js.map +1 -0
  275. package/dist/core/tools/acquire_skill.d.ts +3 -0
  276. package/dist/core/tools/acquire_skill.d.ts.map +1 -0
  277. package/dist/core/tools/acquire_skill.js +30 -0
  278. package/dist/core/tools/acquire_skill.js.map +1 -0
  279. package/dist/core/tools/agent_tools.d.ts +4 -0
  280. package/dist/core/tools/agent_tools.d.ts.map +1 -0
  281. package/dist/core/tools/agent_tools.js +117 -0
  282. package/dist/core/tools/agent_tools.js.map +1 -0
  283. package/dist/core/tools/code_search.d.ts +3 -0
  284. package/dist/core/tools/code_search.d.ts.map +1 -0
  285. package/dist/core/tools/code_search.js +43 -0
  286. package/dist/core/tools/code_search.js.map +1 -0
  287. package/dist/core/tools/craft_tool.d.ts +3 -0
  288. package/dist/core/tools/craft_tool.d.ts.map +1 -0
  289. package/dist/core/tools/craft_tool.js +32 -0
  290. package/dist/core/tools/craft_tool.js.map +1 -0
  291. package/dist/core/tools/discord.d.ts +3 -0
  292. package/dist/core/tools/discord.d.ts.map +1 -0
  293. package/dist/core/tools/discord.js +206 -0
  294. package/dist/core/tools/discord.js.map +1 -0
  295. package/dist/core/tools/dynamic/registry.d.ts +15 -0
  296. package/dist/core/tools/dynamic/registry.d.ts.map +1 -0
  297. package/dist/core/tools/dynamic/registry.js +59 -0
  298. package/dist/core/tools/dynamic/registry.js.map +1 -0
  299. package/dist/core/tools/github.d.ts +3 -0
  300. package/dist/core/tools/github.d.ts.map +1 -0
  301. package/dist/core/tools/github.js +357 -0
  302. package/dist/core/tools/github.js.map +1 -0
  303. package/dist/core/tools/google.d.ts +3 -0
  304. package/dist/core/tools/google.d.ts.map +1 -0
  305. package/dist/core/tools/google.js +409 -0
  306. package/dist/core/tools/google.js.map +1 -0
  307. package/dist/core/tools/index.d.ts +4 -0
  308. package/dist/core/tools/index.d.ts.map +1 -0
  309. package/dist/core/tools/index.js +2338 -0
  310. package/dist/core/tools/index.js.map +1 -0
  311. package/dist/core/tools/optimize_prompt.d.ts +3 -0
  312. package/dist/core/tools/optimize_prompt.d.ts.map +1 -0
  313. package/dist/core/tools/optimize_prompt.js +43 -0
  314. package/dist/core/tools/optimize_prompt.js.map +1 -0
  315. package/dist/core/tools/predict_healing.d.ts +3 -0
  316. package/dist/core/tools/predict_healing.d.ts.map +1 -0
  317. package/dist/core/tools/predict_healing.js +34 -0
  318. package/dist/core/tools/predict_healing.js.map +1 -0
  319. package/dist/core/tools/sage_memory.d.ts +3 -0
  320. package/dist/core/tools/sage_memory.d.ts.map +1 -0
  321. package/dist/core/tools/sage_memory.js +29 -0
  322. package/dist/core/tools/sage_memory.js.map +1 -0
  323. package/dist/core/tools/self_heal.d.ts +3 -0
  324. package/dist/core/tools/self_heal.d.ts.map +1 -0
  325. package/dist/core/tools/self_heal.js +46 -0
  326. package/dist/core/tools/self_heal.js.map +1 -0
  327. package/dist/core/tools/send_briefing.d.ts +3 -0
  328. package/dist/core/tools/send_briefing.d.ts.map +1 -0
  329. package/dist/core/tools/send_briefing.js +31 -0
  330. package/dist/core/tools/send_briefing.js.map +1 -0
  331. package/dist/core/tools/slack.d.ts +3 -0
  332. package/dist/core/tools/slack.d.ts.map +1 -0
  333. package/dist/core/tools/slack.js +256 -0
  334. package/dist/core/tools/slack.js.map +1 -0
  335. package/dist/core/tools/telegram.d.ts +3 -0
  336. package/dist/core/tools/telegram.d.ts.map +1 -0
  337. package/dist/core/tools/telegram.js +211 -0
  338. package/dist/core/tools/telegram.js.map +1 -0
  339. package/dist/core/tools/vox.d.ts +3 -0
  340. package/dist/core/tools/vox.d.ts.map +1 -0
  341. package/dist/core/tools/vox.js +29 -0
  342. package/dist/core/tools/vox.js.map +1 -0
  343. package/dist/core/types/index.d.ts +164 -0
  344. package/dist/core/types/index.d.ts.map +1 -0
  345. package/dist/core/types/index.js +3 -0
  346. package/dist/core/types/index.js.map +1 -0
  347. package/dist/core/vault.d.ts +20 -0
  348. package/dist/core/vault.d.ts.map +1 -0
  349. package/dist/core/vault.js +91 -0
  350. package/dist/core/vault.js.map +1 -0
  351. package/dist/core/verify_v3.d.ts +2 -0
  352. package/dist/core/verify_v3.d.ts.map +1 -0
  353. package/dist/core/verify_v3.js +38 -0
  354. package/dist/core/verify_v3.js.map +1 -0
  355. package/dist/core/verify_v3_5.d.ts +2 -0
  356. package/dist/core/verify_v3_5.d.ts.map +1 -0
  357. package/dist/core/verify_v3_5.js +56 -0
  358. package/dist/core/verify_v3_5.js.map +1 -0
  359. package/dist/core/verify_v4.d.ts +2 -0
  360. package/dist/core/verify_v4.d.ts.map +1 -0
  361. package/dist/core/verify_v4.js +42 -0
  362. package/dist/core/verify_v4.js.map +1 -0
  363. package/dist/core/verify_v5.d.ts +2 -0
  364. package/dist/core/verify_v5.d.ts.map +1 -0
  365. package/dist/core/verify_v5.js +53 -0
  366. package/dist/core/verify_v5.js.map +1 -0
  367. package/dist/core/verify_v6.d.ts +2 -0
  368. package/dist/core/verify_v6.d.ts.map +1 -0
  369. package/dist/core/verify_v6.js +42 -0
  370. package/dist/core/verify_v6.js.map +1 -0
  371. package/dist/core/verify_v7.d.ts +2 -0
  372. package/dist/core/verify_v7.d.ts.map +1 -0
  373. package/dist/core/verify_v7.js +29 -0
  374. package/dist/core/verify_v7.js.map +1 -0
  375. package/dist/core/verify_v8.d.ts +2 -0
  376. package/dist/core/verify_v8.d.ts.map +1 -0
  377. package/dist/core/verify_v8.js +32 -0
  378. package/dist/core/verify_v8.js.map +1 -0
  379. package/dist/core/workflows.d.ts +24 -0
  380. package/dist/core/workflows.d.ts.map +1 -0
  381. package/dist/core/workflows.js +47 -0
  382. package/dist/core/workflows.js.map +1 -0
  383. package/dist/core/workspaces.d.ts +13 -0
  384. package/dist/core/workspaces.d.ts.map +1 -0
  385. package/dist/core/workspaces.js +45 -0
  386. package/dist/core/workspaces.js.map +1 -0
  387. package/dist/enquirer-input.d.ts +3 -0
  388. package/dist/enquirer-input.d.ts.map +1 -0
  389. package/dist/enquirer-input.js +112 -0
  390. package/dist/enquirer-input.js.map +1 -0
  391. package/dist/index.d.ts +3 -0
  392. package/dist/index.d.ts.map +1 -0
  393. package/dist/index.js +241 -0
  394. package/dist/index.js.map +1 -0
  395. package/dist/mcp.d.ts +51 -0
  396. package/dist/mcp.d.ts.map +1 -0
  397. package/dist/mcp.js +201 -0
  398. package/dist/mcp.js.map +1 -0
  399. package/dist/ollama-client.d.ts +15 -0
  400. package/dist/ollama-client.d.ts.map +1 -0
  401. package/dist/ollama-client.js +95 -0
  402. package/dist/ollama-client.js.map +1 -0
  403. package/dist/permissions.d.ts +34 -0
  404. package/dist/permissions.d.ts.map +1 -0
  405. package/dist/permissions.js +224 -0
  406. package/dist/permissions.js.map +1 -0
  407. package/dist/realtime-input.d.ts +2 -0
  408. package/dist/realtime-input.d.ts.map +1 -0
  409. package/dist/realtime-input.js +308 -0
  410. package/dist/realtime-input.js.map +1 -0
  411. package/dist/server.d.ts +20 -0
  412. package/dist/server.d.ts.map +1 -0
  413. package/dist/server.js +203 -0
  414. package/dist/server.js.map +1 -0
  415. package/dist/sessions.d.ts +50 -0
  416. package/dist/sessions.d.ts.map +1 -0
  417. package/dist/sessions.js +181 -0
  418. package/dist/sessions.js.map +1 -0
  419. package/dist/simple-input.d.ts +2 -0
  420. package/dist/simple-input.d.ts.map +1 -0
  421. package/dist/simple-input.js +83 -0
  422. package/dist/simple-input.js.map +1 -0
  423. package/dist/skills.d.ts +17 -0
  424. package/dist/skills.d.ts.map +1 -0
  425. package/dist/skills.js +194 -0
  426. package/dist/skills.js.map +1 -0
  427. package/dist/stats.d.ts +54 -0
  428. package/dist/stats.d.ts.map +1 -0
  429. package/dist/stats.js +220 -0
  430. package/dist/stats.js.map +1 -0
  431. package/dist/tools/discord.d.ts +3 -0
  432. package/dist/tools/discord.d.ts.map +1 -0
  433. package/dist/tools/discord.js +206 -0
  434. package/dist/tools/discord.js.map +1 -0
  435. package/dist/tools/github.d.ts +3 -0
  436. package/dist/tools/github.d.ts.map +1 -0
  437. package/dist/tools/github.js +357 -0
  438. package/dist/tools/github.js.map +1 -0
  439. package/dist/tools/google.d.ts +3 -0
  440. package/dist/tools/google.d.ts.map +1 -0
  441. package/dist/tools/google.js +409 -0
  442. package/dist/tools/google.js.map +1 -0
  443. package/dist/tools/index.d.ts +4 -0
  444. package/dist/tools/index.d.ts.map +1 -0
  445. package/dist/tools/index.js +2139 -0
  446. package/dist/tools/index.js.map +1 -0
  447. package/dist/tools/slack.d.ts +3 -0
  448. package/dist/tools/slack.d.ts.map +1 -0
  449. package/dist/tools/slack.js +256 -0
  450. package/dist/tools/slack.js.map +1 -0
  451. package/dist/tools/telegram.d.ts +3 -0
  452. package/dist/tools/telegram.d.ts.map +1 -0
  453. package/dist/tools/telegram.js +211 -0
  454. package/dist/tools/telegram.js.map +1 -0
  455. package/dist/types/index.d.ts +152 -0
  456. package/dist/types/index.d.ts.map +1 -0
  457. package/dist/types/index.js +3 -0
  458. package/dist/types/index.js.map +1 -0
  459. package/dist/ui.d.ts +101 -0
  460. package/dist/ui.d.ts.map +1 -0
  461. package/dist/ui.js +317 -0
  462. package/dist/ui.js.map +1 -0
  463. package/dist/web/src/lib/utils.d.ts +3 -0
  464. package/dist/web/src/lib/utils.d.ts.map +1 -0
  465. package/dist/web/src/lib/utils.js +6 -0
  466. package/dist/web/src/lib/utils.js.map +1 -0
  467. package/dist/web/src/main.d.ts +2 -0
  468. package/dist/web/src/main.d.ts.map +1 -0
  469. package/dist/web/src/main.js +5 -0
  470. package/dist/web/src/main.js.map +1 -0
  471. package/dist/web/vite.config.d.ts +3 -0
  472. package/dist/web/vite.config.d.ts.map +1 -0
  473. package/dist/web/vite.config.js +12 -0
  474. package/dist/web/vite.config.js.map +1 -0
  475. package/package.json +83 -0
@@ -0,0 +1,1280 @@
1
+ import pc from 'picocolors';
2
+ import wrapAnsi from 'wrap-ansi';
3
+ import { OllamaClient } from './ollama-client.js';
4
+ import { edenAISDK } from './eden-ai-sdk.js';
5
+ import { providerManager } from './providers.js';
6
+ import { tools, toolMap } from './tools/index.js';
7
+ import { dynamicToolRegistry } from './tools/dynamic/registry.js';
8
+ import { eventHub } from './events.js';
9
+ import readline from 'node:readline';
10
+ import { SpinnerManager, renderHeader, renderStatusBar,
11
+ // renderWelcome removed, using renderHeader instead
12
+ renderUserMessage, renderAssistantMessage, renderToolCall, renderToolResult, renderSystemMessage, colors, icons, boxify, getActiveThemeName, listThemes as getThemeList, setTheme as applyTheme, saveThemePreference, progressBar, } from '../cli/ui.js';
13
+ import { ContextManager } from './context.js';
14
+ import { sessionManager } from './sessions.js';
15
+ import { parseSlashCommand, parseMentions } from './commands.js';
16
+ import { realtimeInput } from '../cli/realtime-input.js';
17
+ import { detectSkills, getActiveSkillsInfo, buildEnhancedPrompt } from './skills.js';
18
+ import { AgentManager, formatAgentName } from './agents.js';
19
+ import { SessionManager } from './sessions.js';
20
+ import { PermissionManager, parsePermissionsFromEnv } from './permissions.js';
21
+ import { statsTracker } from './stats.js';
22
+ import { MCPManager } from './mcp.js';
23
+ import { TaskManager } from './tasks.js';
24
+ import { NotificationManager } from './notifications.js';
25
+ import { WorkflowManager } from './workflows.js';
26
+ import { TelegramBotManager } from './telegram.js';
27
+ import { SandboxManager } from './sandbox.js';
28
+ import { CodeIndexer } from './code_indexer.js';
29
+ import { analyticsEngine } from './analytics.js';
30
+ import { SwarmManager } from './swarm_manager.js';
31
+ import { consensusManager } from './consensus.js';
32
+ import { PredictiveHealingEngine } from './nexus.js';
33
+ import { sageMemory } from './memory.js';
34
+ import { TaskOrchestrator } from './orchestrator.js';
35
+ export class EdenAgent {
36
+ client;
37
+ options;
38
+ messages = [];
39
+ transcript = [];
40
+ ollamaTools;
41
+ spinner;
42
+ context;
43
+ agentManager;
44
+ sessionManager;
45
+ permissionManager;
46
+ statsTracker;
47
+ mcpManager;
48
+ taskManager;
49
+ notificationManager;
50
+ workflowManager;
51
+ telegramManager;
52
+ sandboxManager;
53
+ swarmManager;
54
+ nexus;
55
+ codeIndexer;
56
+ orchestrator;
57
+ heartbeatInterval = null;
58
+ pendingApprovals = new Map();
59
+ shouldExit = false;
60
+ totalTasks = 0;
61
+ completedTasks = 0;
62
+ isProcessingPlan = false;
63
+ currentAbortController = null;
64
+ constructor(options) {
65
+ this.options = options;
66
+ this.client = new OllamaClient(options.ollamaUrl);
67
+ this.ollamaTools = this.client.toOllamaTools(tools.map(t => t.definition));
68
+ this.spinner = new SpinnerManager();
69
+ this.context = new ContextManager();
70
+ this.agentManager = new AgentManager('build');
71
+ this.sessionManager = new SessionManager();
72
+ // Initialize PermissionManager with agent permissions (override env vars)
73
+ const envPermissions = parsePermissionsFromEnv();
74
+ const agentPermissions = this.agentManager.getCurrentAgent().permissions;
75
+ const mergedPermissions = { ...envPermissions, ...agentPermissions };
76
+ this.permissionManager = new PermissionManager(mergedPermissions);
77
+ this.statsTracker = statsTracker;
78
+ this.statsTracker.startSession(`session_${Date.now()}`, options.model);
79
+ this.mcpManager = new MCPManager();
80
+ this.taskManager = new TaskManager();
81
+ this.notificationManager = new NotificationManager();
82
+ this.workflowManager = new WorkflowManager();
83
+ this.telegramManager = new TelegramBotManager(this);
84
+ this.sandboxManager = new SandboxManager({ dryRun: false, useDocker: false });
85
+ this.swarmManager = new SwarmManager(this.sandboxManager);
86
+ this.codeIndexer = new CodeIndexer(options.cwd);
87
+ this.nexus = new PredictiveHealingEngine(this.codeIndexer, sageMemory);
88
+ this.orchestrator = new TaskOrchestrator(this, options.cwd);
89
+ this.orchestrator.initialize().catch(e => console.error('Orchestrator init error:', e));
90
+ // Set quiet mode on registry and event hub if specified
91
+ if (options.quiet) {
92
+ dynamicToolRegistry.setQuiet(true);
93
+ eventHub.setQuiet(true);
94
+ }
95
+ // Background index
96
+ this.codeIndexer.indexWorkspace().catch(e => console.error('Indexing error:', e));
97
+ if (options.systemPrompt) {
98
+ const base = `ATENA ORCHESTRATOR | v3.0
99
+ - ORQUESTA especialistas (Build, Plan, Debug, Explore).
100
+ - SEGURIDAD: Sandbox total; gating preventivo obligatorio.
101
+ - PRECISIÓN: Acceso absoluto al repo. Prohibido alucinar.
102
+ ${options.systemPrompt}`;
103
+ const effectivePrompt = this.agentManager.getEffectiveSystemPrompt(base);
104
+ this.messages.push({ role: 'system', content: effectivePrompt });
105
+ }
106
+ if (options.telegramToken) {
107
+ this.telegramManager.start(options.telegramToken);
108
+ }
109
+ this.startHeartbeat();
110
+ this.initSession();
111
+ this.setupInterruptHandler();
112
+ }
113
+ setupInterruptHandler() {
114
+ process.on('SIGINT', () => {
115
+ if (this.currentAbortController) {
116
+ this.currentAbortController.abort();
117
+ this.currentAbortController = null;
118
+ console.log(`\n ${colors.warning(icons.warning)} Respuesta cancelada por el usuario.\n`);
119
+ }
120
+ });
121
+ }
122
+ async initSession() {
123
+ try {
124
+ const session = await sessionManager.createSession(this.messages, this.options.model, 'Eden', this.options.cwd);
125
+ this.sessionManager.setCurrentSessionId(session.id);
126
+ }
127
+ catch (err) {
128
+ // Non-critical
129
+ }
130
+ }
131
+ async persistSession() {
132
+ try {
133
+ await sessionManager.updateCurrentSession(this.messages);
134
+ }
135
+ catch (err) {
136
+ // Non-critical
137
+ }
138
+ }
139
+ startHeartbeat() {
140
+ if (this.heartbeatInterval)
141
+ return;
142
+ this.heartbeatInterval = setInterval(() => this.onHeartbeat(), 30000); // Every 30s
143
+ }
144
+ onHeartbeat() {
145
+ // Check for stale tasks, cleanup, or notify pending approvals
146
+ const runningTasks = this.taskManager.listTasks().filter(t => t.status === 'running');
147
+ if (runningTasks.length > 0) {
148
+ this.notificationManager.notify('Heartbeat Check', `Hay ${runningTasks.length} tareas activas ejecutándose.`, 'info');
149
+ }
150
+ }
151
+ stop() {
152
+ if (this.heartbeatInterval) {
153
+ clearInterval(this.heartbeatInterval);
154
+ this.heartbeatInterval = null;
155
+ }
156
+ this.telegramManager.stop();
157
+ }
158
+ getCodeIndexer() {
159
+ return this.codeIndexer;
160
+ }
161
+ getSandboxManager() {
162
+ return this.sandboxManager;
163
+ }
164
+ getAgentManager() {
165
+ return this.agentManager;
166
+ }
167
+ getTelegramManager() {
168
+ return this.telegramManager;
169
+ }
170
+ renderAgentStatus() {
171
+ const agent = this.agentManager.getCurrentAgent();
172
+ console.log(); // Space above
173
+ console.log(colors.muted(` ${icons.agent} Agente: ${formatAgentName(agent)} | Tab para cambiar`));
174
+ console.log(); // Space below
175
+ }
176
+ switchAgent(agentId) {
177
+ const success = this.agentManager.switchAgent(agentId);
178
+ if (success) {
179
+ const agent = this.agentManager.getCurrentAgent();
180
+ console.log(colors.success(` [OK] Cambiado a agente: ${formatAgentName(agent)}`));
181
+ eventHub.emitEvent({ type: 'agent_switched', data: { agentId: agent.id } });
182
+ // Update PermissionManager with new agent permissions
183
+ this.permissionManager.setPermissions(agent.permissions);
184
+ if (this.messages.length > 0 && this.messages[0].role === 'system') {
185
+ const basePrompt = this.options.systemPrompt || '';
186
+ this.messages[0].content = this.agentManager.getEffectiveSystemPrompt(basePrompt, this.options.cwd);
187
+ }
188
+ }
189
+ return success;
190
+ }
191
+ listAgents() {
192
+ console.log(colors.primary('\n Agentes disponibles:'));
193
+ console.log(colors.muted(' ' + '─'.repeat(50)));
194
+ for (const agent of this.agentManager.listAgents()) {
195
+ const isCurrent = agent.id === this.agentManager.getCurrentAgent().id;
196
+ const marker = isCurrent ? colors.success('● ') : ' ';
197
+ console.log(`${marker}${formatAgentName(agent)} - ${colors.muted(agent.description)}`);
198
+ }
199
+ console.log(colors.muted(' ' + '─'.repeat(50)));
200
+ console.log(colors.muted(' Usa: /agent <nombre> para cambiar\n'));
201
+ }
202
+ // Orchestrator methods
203
+ async executeOrchestratedTask(prompt) {
204
+ const task = await this.orchestrator.planTask(prompt);
205
+ await this.orchestrator.executeAll();
206
+ }
207
+ getOrchestratorProgress() {
208
+ return this.orchestrator.getProgress();
209
+ }
210
+ shouldUseOrchestrator(prompt) {
211
+ const lowerPrompt = prompt.toLowerCase();
212
+ // Verbos de acción directa que disparan ejecución
213
+ const actionVerbs = [
214
+ 'haz', 'hazme', 'crea', 'creame', 'pon', 'instala', 'configura',
215
+ 'arregla', 'fix', 'crear', 'hacer', 'build', 'setup', 'inicializar',
216
+ 'genera', 'generame'
217
+ ];
218
+ const complexityIndicators = [
219
+ 'portfolio', 'web', 'website', 'landing', 'application', 'app',
220
+ 'componente', 'seccion', 'interfaz', 'ui', 'bot', 'script',
221
+ 'sistema', 'dashboard', 'lista', 'backend', 'frontend'
222
+ ];
223
+ const hasAction = actionVerbs.some(verb => lowerPrompt.includes(verb));
224
+ const hasComplexity = complexityIndicators.some(ind => lowerPrompt.includes(ind));
225
+ // Si tiene un verbo de acción o es algo complejo, orquestamos de una.
226
+ return hasAction || hasComplexity || lowerPrompt.length > 800;
227
+ }
228
+ // Session management methods
229
+ async listSessions() {
230
+ const sessions = await this.sessionManager.listSessions(10);
231
+ if (sessions.length === 0) {
232
+ console.log(colors.muted('\n No hay sesiones guardadas.\n'));
233
+ return;
234
+ }
235
+ console.log(colors.primary('\n Sesiones recientes:'));
236
+ console.log(colors.muted(' ' + '─'.repeat(60)));
237
+ for (let i = 0; i < sessions.length; i++) {
238
+ const session = sessions[i];
239
+ const date = new Date(session.updatedAt).toLocaleString('es-ES', {
240
+ day: '2-digit',
241
+ month: 'short',
242
+ hour: '2-digit',
243
+ minute: '2-digit',
244
+ });
245
+ console.log(` ${i + 1}. ${colors.cyan(session.title)}`);
246
+ console.log(` ${colors.muted(`Modelo: ${session.model} | Mensajes: ${session.messageCount} | ${date}`)}`);
247
+ if (session.preview) {
248
+ console.log(` ${colors.dim(session.preview)}`);
249
+ }
250
+ }
251
+ console.log(colors.muted(' ' + '─'.repeat(60)));
252
+ console.log(colors.muted(' Usa: /session load <número> para cargar\n'));
253
+ }
254
+ async saveSession(name) {
255
+ const currentId = this.sessionManager.getCurrentSessionId();
256
+ if (currentId) {
257
+ // Update existing session
258
+ await this.sessionManager.updateCurrentSession(this.messages);
259
+ console.log(colors.success(` [OK] Sesion actualizada: ${colors.cyan(currentId)}`));
260
+ }
261
+ else {
262
+ // Create new session
263
+ const session = await this.sessionManager.createSession(this.messages, this.options.model, this.agentManager.getCurrentAgent().id, process.cwd());
264
+ this.sessionManager.setCurrentSessionId(session.id);
265
+ console.log(colors.success(` [OK] Sesion guardada: ${colors.cyan(session.title)}`));
266
+ }
267
+ }
268
+ async loadSession(indexOrId) {
269
+ let session = null;
270
+ // Check if it's a number (index from list)
271
+ const index = parseInt(indexOrId, 10);
272
+ if (!isNaN(index) && index > 0) {
273
+ const sessions = await this.sessionManager.listSessions(10);
274
+ if (index <= sessions.length) {
275
+ session = await this.sessionManager.loadSession(sessions[index - 1].id);
276
+ }
277
+ }
278
+ else {
279
+ // Treat as ID
280
+ session = await this.sessionManager.loadSession(indexOrId);
281
+ }
282
+ if (!session) {
283
+ console.log(colors.error(` XX No se encontro la sesion: ${indexOrId}`));
284
+ return;
285
+ }
286
+ // Load session data
287
+ this.messages = session.messages;
288
+ this.options.model = session.model;
289
+ this.sessionManager.setCurrentSessionId(session.id);
290
+ // Switch to the agent used in the session
291
+ if (session.metadata.agent) {
292
+ this.agentManager.switchAgent(session.metadata.agent);
293
+ }
294
+ console.log(colors.success(` [OK] Sesion cargada: ${colors.cyan(session.title)}`));
295
+ console.log(colors.muted(` Modelo: ${session.model} | Mensajes: ${session.messages.length}`));
296
+ }
297
+ async exportSession(sessionId) {
298
+ const id = sessionId || this.sessionManager.getCurrentSessionId();
299
+ if (!id) {
300
+ console.log(colors.error(' XX No hay sesion activa para exportar'));
301
+ return;
302
+ }
303
+ const exportPath = await this.sessionManager.exportSession(id);
304
+ if (exportPath) {
305
+ console.log(colors.success(` [OK] Sesion exportada a: ${colors.cyan(exportPath)}`));
306
+ }
307
+ else {
308
+ console.log(colors.error(' XX Error al exportar sesion'));
309
+ }
310
+ }
311
+ setCwd(newCwd) {
312
+ this.options.cwd = newCwd;
313
+ console.log(colors.muted(` ${icons.folder} Directorio de trabajo cambiado a: ${newCwd}`));
314
+ }
315
+ getCwd() {
316
+ return this.options.cwd;
317
+ }
318
+ async deleteSession(sessionId) {
319
+ const success = await this.sessionManager.deleteSession(sessionId);
320
+ if (success) {
321
+ console.log(colors.success(` [OK] Sesion eliminada: ${colors.cyan(sessionId)}`));
322
+ }
323
+ else {
324
+ console.log(colors.error(` XX No se pudo eliminar la sesion: ${sessionId}`));
325
+ }
326
+ }
327
+ // MCP management methods
328
+ async listMCPServers() {
329
+ const servers = this.mcpManager.listServers();
330
+ const connections = this.mcpManager.listConnections();
331
+ if (servers.length === 0) {
332
+ console.log(colors.muted('\n No hay servidores MCP configurados.\n'));
333
+ console.log(colors.muted(' Usa: /mcp add para agregar uno\n'));
334
+ return;
335
+ }
336
+ console.log(colors.primary('\n Servidores MCP:'));
337
+ console.log(colors.muted(' ' + '─'.repeat(60)));
338
+ for (const server of servers) {
339
+ const connection = connections.find(c => c.name === server.name);
340
+ const authStatus = this.mcpManager.getAuthStatus(server.name);
341
+ let statusIcon = '○';
342
+ let statusColor = colors.muted;
343
+ if (connection?.status === 'connected') {
344
+ statusIcon = '*';
345
+ statusColor = colors.success;
346
+ }
347
+ else if (connection?.status === 'error') {
348
+ statusIcon = 'XX';
349
+ statusColor = colors.error;
350
+ }
351
+ console.log(` ${statusColor(statusIcon)} ${colors.cyan(server.name)} (${server.type})`);
352
+ console.log(` ${colors.muted(`Habilitado: ${server.enabled ? 'sí' : 'no'}`)}`);
353
+ if (authStatus.hasOAuth) {
354
+ console.log(` ${colors.muted(`Auth: ${authStatus.authenticated ? 'OK' : '-'}`)}`);
355
+ }
356
+ if (connection?.tools.length) {
357
+ console.log(` ${colors.muted(`Tools: ${connection.tools.join(', ')}`)}`);
358
+ }
359
+ }
360
+ console.log(colors.muted(' ' + '─'.repeat(60)));
361
+ }
362
+ async addMCPServer() {
363
+ await this.mcpManager.setupWizard();
364
+ console.log(colors.success('\n [OK] MCP setup wizard started'));
365
+ console.log(colors.muted(' (Full implementation requires manual configuration)\n'));
366
+ }
367
+ async authenticateMCP(serverName) {
368
+ const success = await this.mcpManager.authenticate(serverName);
369
+ if (success) {
370
+ console.log(colors.success(` [OK] Authenticated with: ${colors.cyan(serverName)}`));
371
+ }
372
+ else {
373
+ console.log(colors.error(` XX Authentication failed with: ${serverName}`));
374
+ }
375
+ }
376
+ async removeMCPServer(serverName) {
377
+ const success = await this.mcpManager.removeServer(serverName);
378
+ if (success) {
379
+ console.log(colors.success(` [OK] MCP server removed: ${colors.cyan(serverName)}`));
380
+ }
381
+ else {
382
+ console.log(colors.error(` XX Server not found: ${serverName}`));
383
+ }
384
+ }
385
+ // Permission management methods
386
+ async setPermission(type, level) {
387
+ const validLevels = ['ask', 'auto', 'deny'];
388
+ if (!validLevels.includes(level)) {
389
+ console.log(colors.error(` XX Invalid level. Use: ask, auto, deny`));
390
+ return;
391
+ }
392
+ this.permissionManager.setPermissions({ [type]: level });
393
+ console.log(colors.success(` [OK] Permission ${type} set to: ${level}`));
394
+ }
395
+ showPermissions() {
396
+ const perms = this.permissionManager.getPermissions();
397
+ console.log(colors.primary('\n Current permissions:'));
398
+ console.log(colors.muted(' ' + '-'.repeat(40)));
399
+ console.log(colors.muted(' ' + '─'.repeat(40)));
400
+ console.log(` fileWrite: ${perms.fileWrite}`);
401
+ console.log(` fileDelete: ${perms.fileDelete}`);
402
+ console.log(` bash: ${perms.bash}`);
403
+ console.log(` network: ${perms.network}`);
404
+ console.log(colors.muted(' ' + '─'.repeat(40)));
405
+ console.log(colors.muted(' Usa: /permission <tipo> <nivel>\n'));
406
+ }
407
+ async showStats() {
408
+ const stats = await this.statsTracker.getStats(7);
409
+ console.log(colors.primary('\n Stats uso (ultimos 7 dias):'));
410
+ console.log(colors.muted(' ' + '─'.repeat(50)));
411
+ console.log(` Sesiones: ${colors.cyan(stats.totalSessions.toString())}`);
412
+ console.log(` Tokens totales: ${colors.cyan(this.statsTracker.formatTokens(stats.totalTokens))}`);
413
+ console.log(` Costo estimado: ${colors.cyan(this.statsTracker.formatCurrency(stats.totalCost))}`);
414
+ if (Object.keys(stats.modelBreakdown).length > 0) {
415
+ console.log(colors.muted(' ' + '─'.repeat(50)));
416
+ console.log(colors.primary(' Por modelo:'));
417
+ for (const [model, data] of Object.entries(stats.modelBreakdown)) {
418
+ console.log(` ${colors.cyan(model)}: ${this.statsTracker.formatTokens(data.tokens)} tokens, ${this.statsTracker.formatCurrency(data.cost)}`);
419
+ }
420
+ }
421
+ if (Object.keys(stats.toolBreakdown).length > 0) {
422
+ console.log(colors.muted(' ' + '─'.repeat(50)));
423
+ console.log(colors.primary(' Tools más usados:'));
424
+ const sortedTools = Object.entries(stats.toolBreakdown).sort((a, b) => b[1] - a[1]).slice(0, 5);
425
+ for (const [tool, count] of sortedTools) {
426
+ console.log(` ${colors.cyan(tool)}: ${count} usos`);
427
+ }
428
+ }
429
+ // Current session stats
430
+ const currentStats = this.statsTracker.getCurrentSessionStats();
431
+ if (currentStats) {
432
+ console.log(colors.muted(' ' + '─'.repeat(50)));
433
+ console.log(colors.primary(' Sesión actual:'));
434
+ console.log(` Tokens: ${this.statsTracker.formatTokens(currentStats.tokenUsage.totalTokens)}`);
435
+ console.log(` Costo: ${this.statsTracker.formatCurrency(currentStats.tokenUsage.cost)}`);
436
+ console.log(` Mensajes: ${currentStats.messages}`);
437
+ }
438
+ console.log(colors.muted(' ' + '─'.repeat(50)));
439
+ console.log();
440
+ }
441
+ showStatus() {
442
+ const agent = this.agentManager.getCurrentAgent();
443
+ const perms = this.permissionManager.getPermissions();
444
+ const currentStats = this.statsTracker.getCurrentSessionStats();
445
+ const fileCount = this.context.getAttachmentCount();
446
+ console.log(colors.primary('\n Estado actual de Eden CLI'));
447
+ console.log(colors.muted(' ' + '─'.repeat(50)));
448
+ console.log(` Modelo: ${colors.cyan(this.options.model)}`);
449
+ console.log(` Agente: ${formatAgentName(agent)}`);
450
+ console.log(` CWD: ${colors.muted(this.options.cwd)}`);
451
+ console.log(` Archivos: ${fileCount > 0 ? colors.cyan(String(fileCount)) : colors.muted('0')}`);
452
+ if (currentStats) {
453
+ console.log(` Mensajes: ${colors.cyan(String(currentStats.messages))}`);
454
+ console.log(` Tokens: ${colors.cyan(this.statsTracker.formatTokens(currentStats.tokenUsage.totalTokens))}`);
455
+ }
456
+ console.log(colors.muted(' ' + '─'.repeat(50)));
457
+ console.log(` Permisos: write=${perms.fileWrite} | delete=${perms.fileDelete} | bash=${perms.bash} | net=${perms.network}`);
458
+ console.log(colors.muted(' ' + '─'.repeat(50)));
459
+ console.log();
460
+ }
461
+ listThemes() {
462
+ const current = getActiveThemeName();
463
+ console.log(colors.primary('\n Temas disponibles:'));
464
+ console.log(colors.muted(' ' + '─'.repeat(40)));
465
+ for (const name of getThemeList()) {
466
+ const marker = name === current ? colors.success('> ') : ' ';
467
+ console.log(` ${marker}${colors.accent(name)}`);
468
+ }
469
+ console.log(colors.muted(' ' + '─'.repeat(40)));
470
+ console.log(colors.muted(` Actual: ${colors.accent(current)}`));
471
+ console.log(colors.muted(` Usa: /theme <nombre>\n`));
472
+ }
473
+ async changeTheme(name) {
474
+ const ok = applyTheme(name);
475
+ if (!ok) {
476
+ console.log(colors.error(` XX Tema no encontrado: ${name}`));
477
+ this.listThemes();
478
+ return;
479
+ }
480
+ await saveThemePreference(name);
481
+ console.log(colors.success(` [OK] Tema cambiado a: ${colors.accent(name)}`));
482
+ }
483
+ isHighRisk(toolName) {
484
+ const highRiskTools = ['delete_file', 'bash_command', 'craft_tool'];
485
+ return highRiskTools.includes(toolName);
486
+ }
487
+ async initiateConsensus(entry) {
488
+ const agents = this.agentManager.listAgents().map(a => a.id);
489
+ const proposal = consensusManager.createProposal(`Ejecutar ${entry.name}`, `El agente ${entry.agentId} solicita ejecutar ${entry.name} con argumentos ${JSON.stringify(entry.args)}`, 'high', agents);
490
+ eventHub.emitEvent({ type: 'notification', data: {
491
+ title: 'Consenso Requerido',
492
+ message: `Propuesta ${proposal.id}: ${proposal.title}`,
493
+ type: 'permission'
494
+ } });
495
+ // In v7.0, sub-agents will autonomously vote based on logic.
496
+ // For now, we'll demonstrate the engine by auto-voting "approved" for non-destructive tests.
497
+ }
498
+ async log(entry) {
499
+ const currentAgent = this.agentManager.getCurrentAgent();
500
+ // Inject agent identity if not present
501
+ if (entry.kind === 'assistant' || entry.kind === 'thinking' || entry.kind === 'tool_call' || entry.kind === 'tool_result') {
502
+ if (!entry.agentId)
503
+ entry.agentId = currentAgent.id;
504
+ if (entry.kind === 'assistant' && !entry.agentName)
505
+ entry.agentName = currentAgent.name;
506
+ }
507
+ this.transcript.push(entry);
508
+ this.renderEntry(entry);
509
+ // Emit real-time event for streaming
510
+ eventHub.emitEvent({ type: 'transcript_entry', data: entry });
511
+ // Check for high-risk actions that require consensus
512
+ if (entry.kind === 'tool_call' && this.isHighRisk(entry.name)) {
513
+ await this.initiateConsensus(entry);
514
+ }
515
+ if (entry.kind === 'tool_call') {
516
+ const task = await this.taskManager.createTask(`Tool: ${entry.name}`, entry.agentId || 'orchestrator');
517
+ eventHub.emitEvent({ type: 'task_started', data: { id: task.id, name: `Tool: ${entry.name}`, agentId: entry.agentId || 'orchestrator' } });
518
+ }
519
+ else if (entry.kind === 'tool_result') {
520
+ const tasks = this.taskManager.listTasks().filter(t => t.status === 'running');
521
+ const task = tasks[tasks.length - 1];
522
+ if (task) {
523
+ this.taskManager.updateTask(task.id, {
524
+ status: entry.isError ? 'failed' : 'completed',
525
+ error: entry.isError ? entry.content : undefined
526
+ });
527
+ eventHub.emitEvent({ type: 'task_updated', data: { id: task.id, status: entry.isError ? 'failed' : 'completed' } });
528
+ }
529
+ }
530
+ }
531
+ emitNotification(notif) {
532
+ this.notificationManager.notify(notif.title, notif.message, notif.type === 'permission' ? 'warning' : 'info');
533
+ }
534
+ getNotifications() {
535
+ return this.notificationManager.getNotifications();
536
+ }
537
+ resolveApproval(id, approved) {
538
+ const resolve = this.pendingApprovals.get(id);
539
+ if (resolve) {
540
+ resolve(approved);
541
+ this.pendingApprovals.delete(id);
542
+ return true;
543
+ }
544
+ return false;
545
+ }
546
+ renderEntry(entry) {
547
+ switch (entry.kind) {
548
+ case 'assistant':
549
+ this.spinner.stop();
550
+ // In interactive mode, we already streamed the message, so we don't render it again
551
+ // unless it's a message being loaded from a session history
552
+ if (!this.options.interactive || entry.metadata?.isFromHistory) {
553
+ renderAssistantMessage(entry.agentName || 'eden', entry.text);
554
+ }
555
+ break;
556
+ case 'thinking':
557
+ this.spinner.update(entry.text);
558
+ break;
559
+ case 'user':
560
+ renderUserMessage(entry.text);
561
+ break;
562
+ case 'tool_call':
563
+ this.spinner.stop();
564
+ renderToolCall(entry.name, (entry.input || {}));
565
+ break;
566
+ case 'tool_result':
567
+ this.spinner.stop();
568
+ renderToolResult({
569
+ status: entry.isError ? 'error' : 'success',
570
+ output: entry.content,
571
+ error: entry.isError ? entry.content : undefined
572
+ });
573
+ break;
574
+ case 'system':
575
+ renderSystemMessage(entry.text);
576
+ break;
577
+ case 'stderr':
578
+ console.log(colors.error(`${icons.error} ${entry.text}`));
579
+ break;
580
+ case 'stdout':
581
+ if (this.options.debug) {
582
+ console.log(colors.muted(`${entry.text}`));
583
+ }
584
+ break;
585
+ }
586
+ }
587
+ async executeTool(call) {
588
+ const toolName = call.function.name;
589
+ const toolArgs = call.function.arguments;
590
+ const tool = toolMap.get(toolName);
591
+ if (!tool) {
592
+ return {
593
+ status: 'error',
594
+ error: `Unknown tool: ${toolName}`,
595
+ };
596
+ }
597
+ // Check permissions for sensitive operations
598
+ let permissionType = null;
599
+ let permissionDesc = '';
600
+ let permissionDetails = '';
601
+ switch (toolName) {
602
+ case 'write_file':
603
+ permissionType = 'fileWrite';
604
+ permissionDesc = 'Escribir archivo';
605
+ permissionDetails = toolArgs.file_path;
606
+ break;
607
+ case 'edit_file':
608
+ permissionType = 'fileWrite';
609
+ permissionDesc = 'Editar archivo';
610
+ permissionDetails = toolArgs.file_path;
611
+ break;
612
+ case 'run_command':
613
+ permissionType = 'bash';
614
+ permissionDesc = 'Ejecutar comando shell';
615
+ permissionDetails = toolArgs.command;
616
+ break;
617
+ case 'view_url':
618
+ case 'web_search':
619
+ case 'browser':
620
+ permissionType = 'network';
621
+ permissionDesc = `Tool: ${toolName}`;
622
+ break;
623
+ }
624
+ if (permissionType) {
625
+ const allowed = await this.permissionManager.checkPermission({
626
+ type: permissionType,
627
+ tool: toolName,
628
+ description: permissionDesc,
629
+ details: permissionDetails,
630
+ });
631
+ if (!allowed) {
632
+ // Emit notification for manual approval if level is 'ask'
633
+ const level = this.permissionManager.getPermissions()[permissionType];
634
+ if (level === 'ask') {
635
+ const approvalId = `approve_${Date.now()}`;
636
+ this.emitNotification({
637
+ id: approvalId,
638
+ type: 'permission',
639
+ title: 'Permiso requerido',
640
+ message: `El agente está solicitando ejecutar: ${permissionDesc}`,
641
+ data: { tool: toolName, details: permissionDetails },
642
+ ts: new Date().toISOString()
643
+ });
644
+ const approved = await new Promise((resolve) => {
645
+ this.pendingApprovals.set(approvalId, resolve);
646
+ });
647
+ if (!approved) {
648
+ return { status: 'error', error: `Permiso rechazado por el usuario: ${permissionDesc}` };
649
+ }
650
+ }
651
+ else {
652
+ return {
653
+ status: 'error',
654
+ error: `Permiso denegado: ${permissionDesc}`,
655
+ };
656
+ }
657
+ }
658
+ }
659
+ try {
660
+ // Record tool usage for stats
661
+ this.statsTracker.recordToolUsage(toolName);
662
+ let result;
663
+ if (toolName === 'run_command') {
664
+ result = await this.sandboxManager.execute(toolArgs.command);
665
+ }
666
+ else {
667
+ result = await Promise.resolve(tool.handler(toolArgs, this));
668
+ }
669
+ analyticsEngine.trackCall(this.agentManager.getCurrentAgent().id, result.status === 'success');
670
+ return result;
671
+ }
672
+ catch (err) {
673
+ analyticsEngine.trackCall(this.agentManager.getCurrentAgent().id, false);
674
+ return {
675
+ status: 'error',
676
+ error: err instanceof Error ? err.message : String(err),
677
+ };
678
+ }
679
+ }
680
+ renderContextStatus() {
681
+ if (this.context.hasAttachments()) {
682
+ const files = this.context.getAttachedFiles();
683
+ const fileList = files.map(f => colors.yellow(`@${f.path.split('/').pop()}`)).join(' ');
684
+ console.log(colors.muted(` ${icons.file} Contexto: ${fileList} (${this.context.getTotalSize() / 1024}KB)`));
685
+ }
686
+ }
687
+ renderActiveSkills(prompt) {
688
+ const { names, count } = getActiveSkillsInfo(prompt);
689
+ if (count > 0) {
690
+ const skillsList = names.map(n => colors.primary(n)).join(', ');
691
+ console.log(colors.muted(` ${icons.sparkle} Skills activas: ${skillsList}`));
692
+ }
693
+ }
694
+ async processInput(userInput) {
695
+ // Check for slash commands
696
+ const slashCmd = parseSlashCommand(userInput);
697
+ if (slashCmd && slashCmd.command) {
698
+ const result = await slashCmd.command.execute(slashCmd.args, this.context);
699
+ // Handle special commands
700
+ if (result === 'CLEAR_SCREEN') {
701
+ console.clear();
702
+ renderHeader({
703
+ sessionId: this.sessionManager.getCurrentSessionId() || 'new-session',
704
+ workDir: this.options.cwd,
705
+ model: this.options.model
706
+ });
707
+ renderStatusBar(this.options.model, this.agentManager.getCurrentAgent().name);
708
+ return null;
709
+ }
710
+ if (result.startsWith('CHANGE_MODEL:')) {
711
+ const newModel = result.split(':')[1];
712
+ this.options.model = newModel;
713
+ console.log(colors.success(`${icons.success} Modelo cambiado a: ${newModel}`));
714
+ renderStatusBar(this.options.model, this.agentManager.getCurrentAgent().name);
715
+ return null;
716
+ }
717
+ if (result === 'AGENT_LIST') {
718
+ this.listAgents();
719
+ return null;
720
+ }
721
+ if (result.startsWith('CHANGE_AGENT:')) {
722
+ const agentId = result.split(':')[1];
723
+ this.switchAgent(agentId);
724
+ return null;
725
+ }
726
+ // Session commands
727
+ if (result === 'SESSION_LIST') {
728
+ await this.listSessions();
729
+ return null;
730
+ }
731
+ if (result === 'SESSION_SAVE') {
732
+ await this.saveSession();
733
+ return null;
734
+ }
735
+ if (result.startsWith('SESSION_LOAD:')) {
736
+ const sessionId = result.split(':')[1];
737
+ await this.loadSession(sessionId);
738
+ return null;
739
+ }
740
+ if (result.startsWith('SESSION_EXPORT:')) {
741
+ const sessionId = result.split(':')[1];
742
+ await this.exportSession(sessionId || undefined);
743
+ return null;
744
+ }
745
+ if (result.startsWith('SESSION_DELETE:')) {
746
+ const sessionId = result.split(':')[1];
747
+ await this.deleteSession(sessionId);
748
+ return null;
749
+ }
750
+ // Permission commands
751
+ if (result === 'PERMISSION_SHOW') {
752
+ this.showPermissions();
753
+ return null;
754
+ }
755
+ if (result.startsWith('PERMISSION_SET:')) {
756
+ const parts = result.split(':');
757
+ const type = parts[1];
758
+ const level = parts[2];
759
+ await this.setPermission(type, level);
760
+ return null;
761
+ }
762
+ if (result === 'STATS_SHOW') {
763
+ await this.showStats();
764
+ return null;
765
+ }
766
+ if (result === 'STATUS_SHOW') {
767
+ this.showStatus();
768
+ return null;
769
+ }
770
+ if (result === 'THEME_LIST') {
771
+ this.listThemes();
772
+ return null;
773
+ }
774
+ if (result.startsWith('THEME_SET:')) {
775
+ const themeName = result.split(':')[1];
776
+ this.changeTheme(themeName);
777
+ return null;
778
+ }
779
+ // MCP commands
780
+ if (result === 'MCP_LIST') {
781
+ await this.listMCPServers();
782
+ return null;
783
+ }
784
+ if (result === 'MCP_ADD') {
785
+ await this.addMCPServer();
786
+ return null;
787
+ }
788
+ if (result.startsWith('MCP_AUTH:')) {
789
+ const serverName = result.split(':')[1];
790
+ await this.authenticateMCP(serverName);
791
+ return null;
792
+ }
793
+ if (result.startsWith('MCP_REMOVE:')) {
794
+ const serverName = result.split(':')[1];
795
+ await this.removeMCPServer(serverName);
796
+ return null;
797
+ }
798
+ // Workflow commands
799
+ if (result === 'WORKFLOW_LIST') {
800
+ const path = await import('node:path');
801
+ const fs = await import('node:fs/promises');
802
+ const wfDir = path.join(this.options.cwd, '.eden', 'workflows');
803
+ try {
804
+ const files = await fs.readdir(wfDir);
805
+ const mds = files.filter(f => f.endsWith('.md') || f.endsWith('.yaml'));
806
+ console.log(colors.primary('\n Flujos de trabajo disponibles en .eden/workflows/:'));
807
+ if (mds.length === 0)
808
+ console.log(colors.muted(' No hay flujos. Crea archivos .md en este directorio.'));
809
+ for (const f of mds) {
810
+ console.log(` • ${f.replace(/\.(md|yaml)$/, '')}`);
811
+ }
812
+ }
813
+ catch {
814
+ console.log(colors.muted('\n No hay flujos. Crea la carpeta .eden/workflows/ y añade archivos .md'));
815
+ }
816
+ return null;
817
+ }
818
+ if (result.startsWith('WORKFLOW_RUN:')) {
819
+ const flowName = result.split(':')[1];
820
+ await this.runWorkflow(flowName);
821
+ return null;
822
+ }
823
+ if (result === 'SESSION_CLEAR') {
824
+ this.messages = [];
825
+ this.transcript = [];
826
+ await this.persistSession();
827
+ return null;
828
+ }
829
+ // Display command result
830
+ console.log(boxify(result, { style: 'round', color: colors.info, title: ' Comando ' }));
831
+ return null;
832
+ }
833
+ // Parse @ mentions
834
+ const { cleanedInput, mentions } = parseMentions(userInput);
835
+ // Attach mentioned files
836
+ if (mentions.length > 0) {
837
+ for (const mention of mentions) {
838
+ const result = await this.context.attachFile(mention);
839
+ if (result.success) {
840
+ console.log(colors.success(` ${icons.success} ${result.message}`));
841
+ }
842
+ else {
843
+ console.log(colors.error(` ${icons.error} ${result.message}`));
844
+ }
845
+ }
846
+ }
847
+ // Build modular prompt
848
+ let finalPrompt = `<user_request>\n${cleanedInput}\n</user_request>`;
849
+ if (this.context.hasAttachments()) {
850
+ finalPrompt = `${this.context.getContextString()}\n\n${finalPrompt}`;
851
+ }
852
+ return finalPrompt || null;
853
+ }
854
+ async runWorkflow(name) {
855
+ const path = await import('node:path');
856
+ const fs = await import('node:fs/promises');
857
+ const wfPath = path.join(this.options.cwd, '.eden', 'workflows', `${name}.md`);
858
+ let content;
859
+ try {
860
+ content = await fs.readFile(wfPath, 'utf8');
861
+ }
862
+ catch {
863
+ console.log(colors.error(` XX No se encontro el flujo: ${name}.md (en .eden/workflows/)`));
864
+ return;
865
+ }
866
+ const lines = content.split('\n')
867
+ .map(l => l.trim())
868
+ .filter(l => l && !l.startsWith('#') && !l.startsWith('//'));
869
+ console.log(colors.success(`\n >> Iniciando flujo: ${name} (${lines.length} pasos)`));
870
+ for (let i = 0; i < lines.length; i++) {
871
+ const step = lines[i];
872
+ console.log(colors.system(`\n -> [Paso ${i + 1}/${lines.length}] Iniciando...`));
873
+ // Re-trigger the input directly
874
+ await this.runSingleTurn(step);
875
+ }
876
+ console.log(colors.success(`\n [OK] Flujo completado exitosamente: ${name}\n`));
877
+ }
878
+ async runSingleTurn(userInput) {
879
+ let finalPrompt = '';
880
+ let messagesToSend = [...this.messages];
881
+ // Empty input means continuation after tool call - skip processing but still call Ollama
882
+ if (!userInput.trim()) {
883
+ // Display current agent
884
+ this.renderAgentStatus();
885
+ }
886
+ else {
887
+ const processed = await this.processInput(userInput);
888
+ if (!processed)
889
+ return;
890
+ finalPrompt = processed;
891
+ // Display current agent and active skills
892
+ this.renderAgentStatus();
893
+ this.renderActiveSkills(userInput);
894
+ const now = new Date().toISOString();
895
+ this.log({
896
+ kind: 'user',
897
+ ts: now,
898
+ text: userInput,
899
+ });
900
+ // Build messages array with skill-enhanced system prompt if needed
901
+ const detectedSkills = detectSkills(userInput);
902
+ const baseSystemPrompt = this.options.systemPrompt || '';
903
+ const agentSystemPrompt = this.agentManager.getEffectiveSystemPrompt(baseSystemPrompt, this.options.cwd);
904
+ const enhancedPrompt = buildEnhancedPrompt(agentSystemPrompt, userInput);
905
+ messagesToSend = [
906
+ { role: 'system', content: enhancedPrompt },
907
+ ...this.messages.filter(m => m.role !== 'system')
908
+ ];
909
+ this.messages.push({
910
+ role: 'user',
911
+ content: finalPrompt,
912
+ });
913
+ messagesToSend.push({
914
+ role: 'user',
915
+ content: finalPrompt,
916
+ });
917
+ }
918
+ // Always call Ollama, even with empty input (for tool continuation)
919
+ let assistantContent = '';
920
+ const toolCalls = [];
921
+ const streamId = `stream_${Date.now()}`;
922
+ try {
923
+ if (this.options.debug) {
924
+ console.log(colors.muted('Calling Ollama API...'));
925
+ }
926
+ this.spinner.start('Pensando...');
927
+ // Emit initial streaming event
928
+ eventHub.emitEvent({
929
+ type: 'stream_start',
930
+ data: { streamId, agentId: this.agentManager.getCurrentAgent().id }
931
+ });
932
+ const abortController = new AbortController();
933
+ let streamAction = null;
934
+ // Raw-mode stdin to intercept Ctrl+C (cancel) and Ctrl+D (exit) during streaming
935
+ // All other keys/paste are silently ignored so nothing appears on screen
936
+ const onRawData = (data) => {
937
+ for (const byte of data) {
938
+ if (byte === 0x03) {
939
+ streamAction = 'cancel';
940
+ abortController.abort();
941
+ return;
942
+ }
943
+ if (byte === 0x04) {
944
+ streamAction = 'exit';
945
+ abortController.abort();
946
+ return;
947
+ }
948
+ }
949
+ };
950
+ process.stdin.setRawMode(true);
951
+ process.stdin.resume();
952
+ process.stdin.on('data', onRawData);
953
+ this.currentAbortController = new AbortController();
954
+ const activeProvider = await providerManager.getActiveProvider();
955
+ const activeModel = await providerManager.getActiveModel();
956
+ const request = {
957
+ model: activeModel,
958
+ messages: messagesToSend,
959
+ tools: this.ollamaTools,
960
+ stream: true,
961
+ };
962
+ let stream;
963
+ try {
964
+ if (activeProvider.id === 'nvidia') {
965
+ stream = edenAISDK.chatStream(request, this.currentAbortController.signal);
966
+ }
967
+ else {
968
+ // Ollama fallback
969
+ stream = this.client.chatStream(request, this.currentAbortController.signal);
970
+ }
971
+ let firstChunk = true;
972
+ const { symbols, renderMarkdown } = await import('../cli/ui.js');
973
+ const readline = await import('node:readline');
974
+ // Accurate line-by-line streaming renderer
975
+ let currentBuffer = '';
976
+ let lastLinesCount = 0;
977
+ for await (const chunk of stream) {
978
+ if (streamAction)
979
+ break;
980
+ if (chunk.message?.content) {
981
+ assistantContent += chunk.message.content;
982
+ currentBuffer += chunk.message.content;
983
+ if (this.options.interactive) {
984
+ if (firstChunk) {
985
+ this.spinner.stop();
986
+ process.stdout.write(` ${pc.dim(symbols.frame)} `);
987
+ firstChunk = false;
988
+ }
989
+ // Simple heuristic: if we have a newline or a significant amount of text,
990
+ // we re-render the "current" streaming block.
991
+ // We move cursor up only for the current assistant message.
992
+ if (lastLinesCount > 0) {
993
+ readline.moveCursor(process.stdout, 0, -lastLinesCount);
994
+ }
995
+ const maxWidth = (process.stdout.columns || 80) - 10;
996
+ // Render current accumulated content with Markdown
997
+ const rendered = renderMarkdown(assistantContent).trim();
998
+ const wrapped = wrapAnsi(rendered, maxWidth, { hard: true });
999
+ const lines = wrapped.split('\n');
1000
+ // Print lines with frame
1001
+ for (let i = 0; i < lines.length; i++) {
1002
+ if (i > 0)
1003
+ process.stdout.write('\n');
1004
+ readline.clearLine(process.stdout, 0);
1005
+ readline.cursorTo(process.stdout, 0);
1006
+ process.stdout.write(` ${pc.dim(symbols.frame)} ${lines[i]}`);
1007
+ }
1008
+ lastLinesCount = lines.length - 1;
1009
+ }
1010
+ else {
1011
+ process.stdout.write(chunk.message.content);
1012
+ }
1013
+ // Emit real-time chunk to web
1014
+ eventHub.emitEvent({
1015
+ type: 'stream_chunk',
1016
+ data: { streamId, content: chunk.message.content, agentId: this.agentManager.getCurrentAgent().id }
1017
+ });
1018
+ }
1019
+ if (chunk.message?.tool_calls) {
1020
+ for (const call of chunk.message.tool_calls) {
1021
+ toolCalls.push(call);
1022
+ }
1023
+ }
1024
+ }
1025
+ if (this.options.interactive && !firstChunk) {
1026
+ process.stdout.write(`\n ${pc.dim(symbols.frame)}\n`);
1027
+ }
1028
+ else if (!this.options.interactive) {
1029
+ process.stdout.write('\n');
1030
+ }
1031
+ }
1032
+ catch (err) {
1033
+ if (streamAction === 'cancel' || streamAction === 'exit' || err.name === 'AbortError') {
1034
+ if (streamAction !== 'exit') {
1035
+ console.log(colors.warning(' [Cancelado] Generacion interrumpida.'));
1036
+ }
1037
+ }
1038
+ else {
1039
+ throw err;
1040
+ }
1041
+ }
1042
+ finally {
1043
+ process.stdin.off('data', onRawData);
1044
+ process.stdin.setRawMode(false);
1045
+ process.stdin.pause();
1046
+ this.spinner.stop();
1047
+ eventHub.emitEvent({
1048
+ type: 'stream_end',
1049
+ data: { streamId, fullContent: assistantContent }
1050
+ });
1051
+ }
1052
+ if (streamAction === 'exit') {
1053
+ this.shouldExit = true;
1054
+ return;
1055
+ }
1056
+ if (assistantContent.trim()) {
1057
+ this.log({
1058
+ kind: 'assistant',
1059
+ ts: new Date().toISOString(),
1060
+ text: assistantContent,
1061
+ });
1062
+ // Estimate and record token usage
1063
+ // Rough estimate: ~4 chars per token for input, ~4 for output
1064
+ const inputTokens = Math.ceil((finalPrompt || userInput).length / 4);
1065
+ const outputTokens = Math.ceil(assistantContent.length / 4);
1066
+ this.statsTracker.recordMessage(inputTokens, outputTokens, this.options.model);
1067
+ }
1068
+ if (toolCalls.length > 0) {
1069
+ for (const call of toolCalls) {
1070
+ const toolCallId = call.id || `call_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;
1071
+ const args = typeof call.function.arguments === 'string'
1072
+ ? JSON.parse(call.function.arguments)
1073
+ : call.function.arguments;
1074
+ // Update the call object with parsed arguments for executeTool and handlers
1075
+ call.function.arguments = args;
1076
+ // If delegating tasks, initialize progress tracking
1077
+ if (call.function.name === 'DELEGATE_TASKS' && args.tasks) {
1078
+ this.isProcessingPlan = true;
1079
+ this.totalTasks = args.tasks.length;
1080
+ this.completedTasks = 0;
1081
+ }
1082
+ // In interactive mode, we don't call log({kind: 'tool_call'}) because it triggers
1083
+ // a second renderToolCall. We just render once and push to transcript.
1084
+ if (this.options.interactive) {
1085
+ renderToolCall(call.function.name, args);
1086
+ if (this.isProcessingPlan) {
1087
+ console.log(` ${progressBar(this.completedTasks, this.totalTasks)}`);
1088
+ }
1089
+ this.transcript.push({
1090
+ kind: 'tool_call',
1091
+ ts: new Date().toISOString(),
1092
+ name: call.function.name,
1093
+ input: args,
1094
+ toolUseId: toolCallId,
1095
+ metadata: {}
1096
+ });
1097
+ }
1098
+ else {
1099
+ this.log({
1100
+ kind: 'tool_call',
1101
+ ts: new Date().toISOString(),
1102
+ name: call.function.name,
1103
+ input: args,
1104
+ toolUseId: toolCallId,
1105
+ });
1106
+ }
1107
+ this.spinner.start(`Ejecutando ${call.function.name}...`);
1108
+ const result = await this.executeTool(call);
1109
+ this.spinner.stop();
1110
+ this.log({
1111
+ kind: 'tool_result',
1112
+ ts: new Date().toISOString(),
1113
+ toolUseId: toolCallId,
1114
+ toolName: call.function.name,
1115
+ content: result.output || result.error || '',
1116
+ isError: result.status === 'error',
1117
+ });
1118
+ this.messages.push({
1119
+ role: 'assistant',
1120
+ content: '',
1121
+ tool_calls: [{
1122
+ ...call,
1123
+ function: {
1124
+ ...call.function,
1125
+ arguments: typeof args === 'string' ? args : JSON.stringify(args)
1126
+ }
1127
+ }],
1128
+ });
1129
+ const rawOutput = result.output || result.error || '';
1130
+ const maxOutputLength = 32000; // Limit context per tool result
1131
+ let finalOutput = typeof rawOutput === 'string' ? rawOutput : JSON.stringify(rawOutput);
1132
+ if (finalOutput.length > maxOutputLength) {
1133
+ finalOutput = finalOutput.slice(0, maxOutputLength) +
1134
+ `... \n\n[RESULTADO TRUNCADO: ${finalOutput.length - maxOutputLength} caracteres omitidos por brevedad y límites de contexto]`;
1135
+ }
1136
+ this.messages.push({
1137
+ role: 'tool',
1138
+ content: finalOutput,
1139
+ tool_call_id: toolCallId,
1140
+ });
1141
+ // Update progress if in a plan
1142
+ if (this.isProcessingPlan && result.status === 'success') {
1143
+ this.completedTasks++;
1144
+ if (this.completedTasks >= this.totalTasks) {
1145
+ // Plan finished (or at least all delegated tasks are done)
1146
+ // We'll keep isProcessingPlan true until the final response
1147
+ }
1148
+ }
1149
+ }
1150
+ // Continue with another turn to let the AI respond to tool results
1151
+ try {
1152
+ await this.runSingleTurn('');
1153
+ }
1154
+ catch (continueErr) {
1155
+ this.log({
1156
+ kind: 'system',
1157
+ ts: new Date().toISOString(),
1158
+ text: `Error continuing after tool: ${continueErr instanceof Error ? continueErr.message : String(continueErr)}`,
1159
+ });
1160
+ }
1161
+ }
1162
+ else {
1163
+ this.messages.push({
1164
+ role: 'assistant',
1165
+ content: assistantContent,
1166
+ });
1167
+ }
1168
+ }
1169
+ catch (err) {
1170
+ this.spinner.stop();
1171
+ this.log({
1172
+ kind: 'system',
1173
+ ts: new Date().toISOString(),
1174
+ text: `Error: ${err instanceof Error ? err.message : String(err)}`,
1175
+ });
1176
+ }
1177
+ }
1178
+ async runInteractive() {
1179
+ // Resume previous session prompt
1180
+ const sessions = await this.sessionManager.listSessions(5);
1181
+ const cwdSessions = sessions.filter(s => s.metadata?.cwd === this.options.cwd);
1182
+ if (cwdSessions.length > 0 && !this.sessionManager.getCurrentSessionId()) {
1183
+ const last = cwdSessions[0];
1184
+ const date = new Date(last.updatedAt).toLocaleString('es-ES');
1185
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
1186
+ const answer = await new Promise(resolve => {
1187
+ rl.question(` ${colors.muted('Resumir sesion:')} ${colors.accent(last.title)} ${colors.dim(`(${last.messageCount} msgs, ${date})`)} [Y/n/list] `, resolve);
1188
+ });
1189
+ rl.close();
1190
+ const a = answer.trim().toLowerCase();
1191
+ if (a === '' || a.startsWith('y')) {
1192
+ await this.loadSession(last.id);
1193
+ console.log(colors.success(` [OK] Sesion resumida`));
1194
+ }
1195
+ else if (a.startsWith('l')) {
1196
+ console.log();
1197
+ cwdSessions.forEach((s, i) => {
1198
+ const d = new Date(s.updatedAt).toLocaleString('es-ES');
1199
+ console.log(` ${colors.emerald(`${i + 1}.`)} ${colors.cyan(s.title)} ${colors.muted(`(${s.messageCount} msgs) ${d}`)}`);
1200
+ });
1201
+ console.log();
1202
+ const rl2 = readline.createInterface({ input: process.stdin, output: process.stdout });
1203
+ const ans2 = await new Promise(resolve => {
1204
+ rl2.question(` ${colors.muted('Numero para cargar (o Enter para nueva):')} `, resolve);
1205
+ });
1206
+ rl2.close();
1207
+ const idx = parseInt(ans2.trim(), 10);
1208
+ if (!isNaN(idx) && idx > 0 && idx <= cwdSessions.length) {
1209
+ await this.loadSession(cwdSessions[idx - 1].id);
1210
+ console.log(colors.success(` [OK] Sesion resumida`));
1211
+ }
1212
+ }
1213
+ }
1214
+ const activeProvider = await providerManager.getActiveProvider();
1215
+ const activeModel = await providerManager.getActiveModel();
1216
+ // Render modern header
1217
+ renderHeader({
1218
+ sessionId: this.sessionManager.getCurrentSessionId() || 'new-session',
1219
+ workDir: this.options.cwd,
1220
+ model: `${activeProvider.id} / ${activeModel}`
1221
+ });
1222
+ renderStatusBar(activeModel, this.agentManager.getCurrentAgent().name);
1223
+ // Catch Ctrl+C outside raw mode and show hint
1224
+ process.on('SIGINT', () => {
1225
+ console.log(`\n ${colors.dim('Tip:')} ${colors.accent('Ctrl+D')} ${colors.dim('para salir de Eden')}`);
1226
+ });
1227
+ while (true) {
1228
+ console.log();
1229
+ // Use the symbols from ui.js
1230
+ const { symbols } = await import('../cli/ui.js');
1231
+ const input = await realtimeInput(` ${pc.dim(symbols.frame)} `);
1232
+ if (input.toLowerCase() === 'exit' || input.toLowerCase() === 'quit') {
1233
+ await this.saveSession();
1234
+ console.log();
1235
+ console.log(boxify(`${colors.success('Gracias por usar Eden')}\n\n` +
1236
+ `${colors.muted('Sesion guardada. Puedes retomarla mas tarde.')}`, { style: 'round', color: colors.success }));
1237
+ console.log();
1238
+ break;
1239
+ }
1240
+ if (input.trim()) {
1241
+ const cmd = input.trim().toLowerCase();
1242
+ if (cmd === '/models' || cmd === '/tags') {
1243
+ console.log(pc.cyan(`\n 📦 Consultando modelos disponibles...`));
1244
+ try {
1245
+ const list = await this.client.listModels();
1246
+ console.log();
1247
+ list.models.sort((a, b) => a.name.localeCompare(b.name)).forEach(m => {
1248
+ const sizeGB = (m.size / 1e9).toFixed(2);
1249
+ console.log(` • ${pc.bold(m.name)} ${pc.dim(`(${sizeGB} GB)`)}`);
1250
+ });
1251
+ }
1252
+ catch (err) {
1253
+ console.log(pc.red(` ❌ Error: ${err instanceof Error ? err.message : String(err)}`));
1254
+ }
1255
+ continue;
1256
+ }
1257
+ await this.runSingleTurn(input);
1258
+ if (this.shouldExit) {
1259
+ await this.saveSession();
1260
+ console.log();
1261
+ console.log(boxify(`${colors.success('Gracias por usar Eden')}\n\n` +
1262
+ `${colors.muted('Sesion guardada. Puedes retomarla mas tarde.')}`, { style: 'round', color: colors.success }));
1263
+ console.log();
1264
+ break;
1265
+ }
1266
+ this.renderContextStatus();
1267
+ }
1268
+ }
1269
+ }
1270
+ getTranscript() {
1271
+ return [...this.transcript];
1272
+ }
1273
+ getActiveTasks() {
1274
+ return this.taskManager.listTasks();
1275
+ }
1276
+ async listPersistentSessions() {
1277
+ return await this.sessionManager.listSessions(50);
1278
+ }
1279
+ }
1280
+ //# sourceMappingURL=agent.js.map