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.
- package/LICENSE +21 -0
- package/README.md +210 -0
- package/dist/agent.d.ts +44 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +731 -0
- package/dist/agent.js.map +1 -0
- package/dist/agents.d.ts +33 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +162 -0
- package/dist/agents.js.map +1 -0
- package/dist/autocomplete.d.ts +4 -0
- package/dist/autocomplete.d.ts.map +1 -0
- package/dist/autocomplete.js +96 -0
- package/dist/autocomplete.js.map +1 -0
- package/dist/cli/commands/connect.d.ts +3 -0
- package/dist/cli/commands/connect.d.ts.map +1 -0
- package/dist/cli/commands/connect.js +31 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +3 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js +26 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/login.d.ts +3 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +46 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +3 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +73 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +309 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init/setup.d.ts +3 -0
- package/dist/cli/init/setup.d.ts.map +1 -0
- package/dist/cli/init/setup.js +74 -0
- package/dist/cli/init/setup.js.map +1 -0
- package/dist/cli/menus.d.ts +2 -0
- package/dist/cli/menus.d.ts.map +1 -0
- package/dist/cli/menus.js +111 -0
- package/dist/cli/menus.js.map +1 -0
- package/dist/cli/postinstall.d.ts +9 -0
- package/dist/cli/postinstall.d.ts.map +1 -0
- package/dist/cli/postinstall.js +81 -0
- package/dist/cli/postinstall.js.map +1 -0
- package/dist/cli/realtime-input.d.ts +4 -0
- package/dist/cli/realtime-input.d.ts.map +1 -0
- package/dist/cli/realtime-input.js +268 -0
- package/dist/cli/realtime-input.js.map +1 -0
- package/dist/cli/setup.d.ts +26 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +202 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/themes.d.ts +30 -0
- package/dist/cli/themes.d.ts.map +1 -0
- package/dist/cli/themes.js +225 -0
- package/dist/cli/themes.js.map +1 -0
- package/dist/cli/ui.d.ts +70 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +455 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/commands.d.ts +16 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +230 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +140 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +23 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +80 -0
- package/dist/context.js.map +1 -0
- package/dist/core/agent.d.ts +94 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +1280 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/agents/enterprise/backend.d.ts +3 -0
- package/dist/core/agents/enterprise/backend.d.ts.map +1 -0
- package/dist/core/agents/enterprise/backend.js +35 -0
- package/dist/core/agents/enterprise/backend.js.map +1 -0
- package/dist/core/agents/enterprise/cloud.d.ts +3 -0
- package/dist/core/agents/enterprise/cloud.d.ts.map +1 -0
- package/dist/core/agents/enterprise/cloud.js +35 -0
- package/dist/core/agents/enterprise/cloud.js.map +1 -0
- package/dist/core/agents/enterprise/datascience.d.ts +3 -0
- package/dist/core/agents/enterprise/datascience.d.ts.map +1 -0
- package/dist/core/agents/enterprise/datascience.js +35 -0
- package/dist/core/agents/enterprise/datascience.js.map +1 -0
- package/dist/core/agents/enterprise/design.d.ts +3 -0
- package/dist/core/agents/enterprise/design.d.ts.map +1 -0
- package/dist/core/agents/enterprise/design.js +35 -0
- package/dist/core/agents/enterprise/design.js.map +1 -0
- package/dist/core/agents/enterprise/devops.d.ts +3 -0
- package/dist/core/agents/enterprise/devops.d.ts.map +1 -0
- package/dist/core/agents/enterprise/devops.js +35 -0
- package/dist/core/agents/enterprise/devops.js.map +1 -0
- package/dist/core/agents/enterprise/finance.d.ts +3 -0
- package/dist/core/agents/enterprise/finance.d.ts.map +1 -0
- package/dist/core/agents/enterprise/finance.js +35 -0
- package/dist/core/agents/enterprise/finance.js.map +1 -0
- package/dist/core/agents/enterprise/frontend.d.ts +3 -0
- package/dist/core/agents/enterprise/frontend.d.ts.map +1 -0
- package/dist/core/agents/enterprise/frontend.js +35 -0
- package/dist/core/agents/enterprise/frontend.js.map +1 -0
- package/dist/core/agents/enterprise/hr.d.ts +3 -0
- package/dist/core/agents/enterprise/hr.d.ts.map +1 -0
- package/dist/core/agents/enterprise/hr.js +35 -0
- package/dist/core/agents/enterprise/hr.js.map +1 -0
- package/dist/core/agents/enterprise/index.d.ts +4 -0
- package/dist/core/agents/enterprise/index.d.ts.map +1 -0
- package/dist/core/agents/enterprise/index.js +44 -0
- package/dist/core/agents/enterprise/index.js.map +1 -0
- package/dist/core/agents/enterprise/legal.d.ts +3 -0
- package/dist/core/agents/enterprise/legal.d.ts.map +1 -0
- package/dist/core/agents/enterprise/legal.js +35 -0
- package/dist/core/agents/enterprise/legal.js.map +1 -0
- package/dist/core/agents/enterprise/marketing.d.ts +3 -0
- package/dist/core/agents/enterprise/marketing.d.ts.map +1 -0
- package/dist/core/agents/enterprise/marketing.js +35 -0
- package/dist/core/agents/enterprise/marketing.js.map +1 -0
- package/dist/core/agents/enterprise/pm.d.ts +3 -0
- package/dist/core/agents/enterprise/pm.d.ts.map +1 -0
- package/dist/core/agents/enterprise/pm.js +35 -0
- package/dist/core/agents/enterprise/pm.js.map +1 -0
- package/dist/core/agents/enterprise/product.d.ts +3 -0
- package/dist/core/agents/enterprise/product.d.ts.map +1 -0
- package/dist/core/agents/enterprise/product.js +35 -0
- package/dist/core/agents/enterprise/product.js.map +1 -0
- package/dist/core/agents/enterprise/qa.d.ts +3 -0
- package/dist/core/agents/enterprise/qa.d.ts.map +1 -0
- package/dist/core/agents/enterprise/qa.js +35 -0
- package/dist/core/agents/enterprise/qa.js.map +1 -0
- package/dist/core/agents/enterprise/sales.d.ts +3 -0
- package/dist/core/agents/enterprise/sales.d.ts.map +1 -0
- package/dist/core/agents/enterprise/sales.js +35 -0
- package/dist/core/agents/enterprise/sales.js.map +1 -0
- package/dist/core/agents/enterprise/security.d.ts +3 -0
- package/dist/core/agents/enterprise/security.d.ts.map +1 -0
- package/dist/core/agents/enterprise/security.js +36 -0
- package/dist/core/agents/enterprise/security.js.map +1 -0
- package/dist/core/agents/enterprise/support.d.ts +3 -0
- package/dist/core/agents/enterprise/support.d.ts.map +1 -0
- package/dist/core/agents/enterprise/support.js +35 -0
- package/dist/core/agents/enterprise/support.js.map +1 -0
- package/dist/core/agents.d.ts +84 -0
- package/dist/core/agents.d.ts.map +1 -0
- package/dist/core/agents.js +266 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/analytics.d.ts +21 -0
- package/dist/core/analytics.d.ts.map +1 -0
- package/dist/core/analytics.js +57 -0
- package/dist/core/analytics.js.map +1 -0
- package/dist/core/auth.d.ts +43 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +110 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/code_indexer.d.ts +14 -0
- package/dist/core/code_indexer.d.ts.map +1 -0
- package/dist/core/code_indexer.js +52 -0
- package/dist/core/code_indexer.js.map +1 -0
- package/dist/core/commands.d.ts +16 -0
- package/dist/core/commands.d.ts.map +1 -0
- package/dist/core/commands.js +285 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/consensus.d.ts +25 -0
- package/dist/core/consensus.d.ts.map +1 -0
- package/dist/core/consensus.js +49 -0
- package/dist/core/consensus.js.map +1 -0
- package/dist/core/context.d.ts +23 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +82 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/eden-ai-sdk.d.ts +11 -0
- package/dist/core/eden-ai-sdk.d.ts.map +1 -0
- package/dist/core/eden-ai-sdk.js +158 -0
- package/dist/core/eden-ai-sdk.js.map +1 -0
- package/dist/core/events.d.ts +64 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +18 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/groq-client.d.ts +7 -0
- package/dist/core/groq-client.d.ts.map +1 -0
- package/dist/core/groq-client.js +112 -0
- package/dist/core/groq-client.js.map +1 -0
- package/dist/core/mcp.d.ts +51 -0
- package/dist/core/mcp.d.ts.map +1 -0
- package/dist/core/mcp.js +201 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/core/memory.d.ts +20 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +61 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/model-profiles.d.ts +62 -0
- package/dist/core/model-profiles.d.ts.map +1 -0
- package/dist/core/model-profiles.js +841 -0
- package/dist/core/model-profiles.js.map +1 -0
- package/dist/core/moonshot-client.d.ts +7 -0
- package/dist/core/moonshot-client.d.ts.map +1 -0
- package/dist/core/moonshot-client.js +102 -0
- package/dist/core/moonshot-client.js.map +1 -0
- package/dist/core/nexus.d.ts +16 -0
- package/dist/core/nexus.d.ts.map +1 -0
- package/dist/core/nexus.js +31 -0
- package/dist/core/nexus.js.map +1 -0
- package/dist/core/notifications.d.ts +16 -0
- package/dist/core/notifications.d.ts.map +1 -0
- package/dist/core/notifications.js +26 -0
- package/dist/core/notifications.js.map +1 -0
- package/dist/core/ollama-client.d.ts +16 -0
- package/dist/core/ollama-client.d.ts.map +1 -0
- package/dist/core/ollama-client.js +138 -0
- package/dist/core/ollama-client.js.map +1 -0
- package/dist/core/orchestrator.d.ts +96 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +801 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/permissions.d.ts +34 -0
- package/dist/core/permissions.d.ts.map +1 -0
- package/dist/core/permissions.js +224 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/providers.d.ts +22 -0
- package/dist/core/providers.d.ts.map +1 -0
- package/dist/core/providers.js +81 -0
- package/dist/core/providers.js.map +1 -0
- package/dist/core/researcher.d.ts +24 -0
- package/dist/core/researcher.d.ts.map +1 -0
- package/dist/core/researcher.js +97 -0
- package/dist/core/researcher.js.map +1 -0
- package/dist/core/sandbox.d.ts +22 -0
- package/dist/core/sandbox.d.ts.map +1 -0
- package/dist/core/sandbox.js +79 -0
- package/dist/core/sandbox.js.map +1 -0
- package/dist/core/scavenger.d.ts +5 -0
- package/dist/core/scavenger.d.ts.map +1 -0
- package/dist/core/scavenger.js +51 -0
- package/dist/core/scavenger.js.map +1 -0
- package/dist/core/server.d.ts +21 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +776 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/sessions.d.ts +54 -0
- package/dist/core/sessions.d.ts.map +1 -0
- package/dist/core/sessions.js +182 -0
- package/dist/core/sessions.js.map +1 -0
- package/dist/core/setup.d.ts +12 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +70 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/skills.d.ts +17 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +123 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/stats.d.ts +54 -0
- package/dist/core/stats.d.ts.map +1 -0
- package/dist/core/stats.js +221 -0
- package/dist/core/stats.js.map +1 -0
- package/dist/core/swarm_manager.d.ts +20 -0
- package/dist/core/swarm_manager.d.ts.map +1 -0
- package/dist/core/swarm_manager.js +48 -0
- package/dist/core/swarm_manager.js.map +1 -0
- package/dist/core/system.d.ts +39 -0
- package/dist/core/system.d.ts.map +1 -0
- package/dist/core/system.js +129 -0
- package/dist/core/system.js.map +1 -0
- package/dist/core/tasks.d.ts +24 -0
- package/dist/core/tasks.d.ts.map +1 -0
- package/dist/core/tasks.js +66 -0
- package/dist/core/tasks.js.map +1 -0
- package/dist/core/telegram.d.ts +9 -0
- package/dist/core/telegram.d.ts.map +1 -0
- package/dist/core/telegram.js +49 -0
- package/dist/core/telegram.js.map +1 -0
- package/dist/core/tools/acquire_skill.d.ts +3 -0
- package/dist/core/tools/acquire_skill.d.ts.map +1 -0
- package/dist/core/tools/acquire_skill.js +30 -0
- package/dist/core/tools/acquire_skill.js.map +1 -0
- package/dist/core/tools/agent_tools.d.ts +4 -0
- package/dist/core/tools/agent_tools.d.ts.map +1 -0
- package/dist/core/tools/agent_tools.js +117 -0
- package/dist/core/tools/agent_tools.js.map +1 -0
- package/dist/core/tools/code_search.d.ts +3 -0
- package/dist/core/tools/code_search.d.ts.map +1 -0
- package/dist/core/tools/code_search.js +43 -0
- package/dist/core/tools/code_search.js.map +1 -0
- package/dist/core/tools/craft_tool.d.ts +3 -0
- package/dist/core/tools/craft_tool.d.ts.map +1 -0
- package/dist/core/tools/craft_tool.js +32 -0
- package/dist/core/tools/craft_tool.js.map +1 -0
- package/dist/core/tools/discord.d.ts +3 -0
- package/dist/core/tools/discord.d.ts.map +1 -0
- package/dist/core/tools/discord.js +206 -0
- package/dist/core/tools/discord.js.map +1 -0
- package/dist/core/tools/dynamic/registry.d.ts +15 -0
- package/dist/core/tools/dynamic/registry.d.ts.map +1 -0
- package/dist/core/tools/dynamic/registry.js +59 -0
- package/dist/core/tools/dynamic/registry.js.map +1 -0
- package/dist/core/tools/github.d.ts +3 -0
- package/dist/core/tools/github.d.ts.map +1 -0
- package/dist/core/tools/github.js +357 -0
- package/dist/core/tools/github.js.map +1 -0
- package/dist/core/tools/google.d.ts +3 -0
- package/dist/core/tools/google.d.ts.map +1 -0
- package/dist/core/tools/google.js +409 -0
- package/dist/core/tools/google.js.map +1 -0
- package/dist/core/tools/index.d.ts +4 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +2338 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/optimize_prompt.d.ts +3 -0
- package/dist/core/tools/optimize_prompt.d.ts.map +1 -0
- package/dist/core/tools/optimize_prompt.js +43 -0
- package/dist/core/tools/optimize_prompt.js.map +1 -0
- package/dist/core/tools/predict_healing.d.ts +3 -0
- package/dist/core/tools/predict_healing.d.ts.map +1 -0
- package/dist/core/tools/predict_healing.js +34 -0
- package/dist/core/tools/predict_healing.js.map +1 -0
- package/dist/core/tools/sage_memory.d.ts +3 -0
- package/dist/core/tools/sage_memory.d.ts.map +1 -0
- package/dist/core/tools/sage_memory.js +29 -0
- package/dist/core/tools/sage_memory.js.map +1 -0
- package/dist/core/tools/self_heal.d.ts +3 -0
- package/dist/core/tools/self_heal.d.ts.map +1 -0
- package/dist/core/tools/self_heal.js +46 -0
- package/dist/core/tools/self_heal.js.map +1 -0
- package/dist/core/tools/send_briefing.d.ts +3 -0
- package/dist/core/tools/send_briefing.d.ts.map +1 -0
- package/dist/core/tools/send_briefing.js +31 -0
- package/dist/core/tools/send_briefing.js.map +1 -0
- package/dist/core/tools/slack.d.ts +3 -0
- package/dist/core/tools/slack.d.ts.map +1 -0
- package/dist/core/tools/slack.js +256 -0
- package/dist/core/tools/slack.js.map +1 -0
- package/dist/core/tools/telegram.d.ts +3 -0
- package/dist/core/tools/telegram.d.ts.map +1 -0
- package/dist/core/tools/telegram.js +211 -0
- package/dist/core/tools/telegram.js.map +1 -0
- package/dist/core/tools/vox.d.ts +3 -0
- package/dist/core/tools/vox.d.ts.map +1 -0
- package/dist/core/tools/vox.js +29 -0
- package/dist/core/tools/vox.js.map +1 -0
- package/dist/core/types/index.d.ts +164 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +3 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/vault.d.ts +20 -0
- package/dist/core/vault.d.ts.map +1 -0
- package/dist/core/vault.js +91 -0
- package/dist/core/vault.js.map +1 -0
- package/dist/core/verify_v3.d.ts +2 -0
- package/dist/core/verify_v3.d.ts.map +1 -0
- package/dist/core/verify_v3.js +38 -0
- package/dist/core/verify_v3.js.map +1 -0
- package/dist/core/verify_v3_5.d.ts +2 -0
- package/dist/core/verify_v3_5.d.ts.map +1 -0
- package/dist/core/verify_v3_5.js +56 -0
- package/dist/core/verify_v3_5.js.map +1 -0
- package/dist/core/verify_v4.d.ts +2 -0
- package/dist/core/verify_v4.d.ts.map +1 -0
- package/dist/core/verify_v4.js +42 -0
- package/dist/core/verify_v4.js.map +1 -0
- package/dist/core/verify_v5.d.ts +2 -0
- package/dist/core/verify_v5.d.ts.map +1 -0
- package/dist/core/verify_v5.js +53 -0
- package/dist/core/verify_v5.js.map +1 -0
- package/dist/core/verify_v6.d.ts +2 -0
- package/dist/core/verify_v6.d.ts.map +1 -0
- package/dist/core/verify_v6.js +42 -0
- package/dist/core/verify_v6.js.map +1 -0
- package/dist/core/verify_v7.d.ts +2 -0
- package/dist/core/verify_v7.d.ts.map +1 -0
- package/dist/core/verify_v7.js +29 -0
- package/dist/core/verify_v7.js.map +1 -0
- package/dist/core/verify_v8.d.ts +2 -0
- package/dist/core/verify_v8.d.ts.map +1 -0
- package/dist/core/verify_v8.js +32 -0
- package/dist/core/verify_v8.js.map +1 -0
- package/dist/core/workflows.d.ts +24 -0
- package/dist/core/workflows.d.ts.map +1 -0
- package/dist/core/workflows.js +47 -0
- package/dist/core/workflows.js.map +1 -0
- package/dist/core/workspaces.d.ts +13 -0
- package/dist/core/workspaces.d.ts.map +1 -0
- package/dist/core/workspaces.js +45 -0
- package/dist/core/workspaces.js.map +1 -0
- package/dist/enquirer-input.d.ts +3 -0
- package/dist/enquirer-input.d.ts.map +1 -0
- package/dist/enquirer-input.js +112 -0
- package/dist/enquirer-input.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +241 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +51 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +201 -0
- package/dist/mcp.js.map +1 -0
- package/dist/ollama-client.d.ts +15 -0
- package/dist/ollama-client.d.ts.map +1 -0
- package/dist/ollama-client.js +95 -0
- package/dist/ollama-client.js.map +1 -0
- package/dist/permissions.d.ts +34 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +224 -0
- package/dist/permissions.js.map +1 -0
- package/dist/realtime-input.d.ts +2 -0
- package/dist/realtime-input.d.ts.map +1 -0
- package/dist/realtime-input.js +308 -0
- package/dist/realtime-input.js.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +203 -0
- package/dist/server.js.map +1 -0
- package/dist/sessions.d.ts +50 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +181 -0
- package/dist/sessions.js.map +1 -0
- package/dist/simple-input.d.ts +2 -0
- package/dist/simple-input.d.ts.map +1 -0
- package/dist/simple-input.js +83 -0
- package/dist/simple-input.js.map +1 -0
- package/dist/skills.d.ts +17 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +194 -0
- package/dist/skills.js.map +1 -0
- package/dist/stats.d.ts +54 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +220 -0
- package/dist/stats.js.map +1 -0
- package/dist/tools/discord.d.ts +3 -0
- package/dist/tools/discord.d.ts.map +1 -0
- package/dist/tools/discord.js +206 -0
- package/dist/tools/discord.js.map +1 -0
- package/dist/tools/github.d.ts +3 -0
- package/dist/tools/github.d.ts.map +1 -0
- package/dist/tools/github.js +357 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/google.d.ts +3 -0
- package/dist/tools/google.d.ts.map +1 -0
- package/dist/tools/google.js +409 -0
- package/dist/tools/google.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +2139 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/slack.d.ts +3 -0
- package/dist/tools/slack.d.ts.map +1 -0
- package/dist/tools/slack.js +256 -0
- package/dist/tools/slack.js.map +1 -0
- package/dist/tools/telegram.d.ts +3 -0
- package/dist/tools/telegram.d.ts.map +1 -0
- package/dist/tools/telegram.js +211 -0
- package/dist/tools/telegram.js.map +1 -0
- package/dist/types/index.d.ts +152 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui.d.ts +101 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +317 -0
- package/dist/ui.js.map +1 -0
- package/dist/web/src/lib/utils.d.ts +3 -0
- package/dist/web/src/lib/utils.d.ts.map +1 -0
- package/dist/web/src/lib/utils.js +6 -0
- package/dist/web/src/lib/utils.js.map +1 -0
- package/dist/web/src/main.d.ts +2 -0
- package/dist/web/src/main.d.ts.map +1 -0
- package/dist/web/src/main.js +5 -0
- package/dist/web/src/main.js.map +1 -0
- package/dist/web/vite.config.d.ts +3 -0
- package/dist/web/vite.config.d.ts.map +1 -0
- package/dist/web/vite.config.js +12 -0
- package/dist/web/vite.config.js.map +1 -0
- 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
|