yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
agent.cc
Go to the documentation of this file.
1#include <algorithm>
2#include <sstream>
3#include <string>
4#include <vector>
5
6#include "absl/flags/declare.h"
7#include "absl/flags/flag.h"
8#include "absl/status/status.h"
9#include "absl/strings/str_cat.h"
10#include "rom/rom.h"
11#include "cli/cli.h"
16
17ABSL_DECLARE_FLAG(bool, quiet);
18
19namespace yaze {
20namespace cli {
21
22// Forward declarations for special agent commands (not in registry)
23namespace agent {
24absl::Status HandleRunCommand(const std::vector<std::string>& args, Rom& rom);
25absl::Status HandlePlanCommand(const std::vector<std::string>& args);
26absl::Status HandleTestCommand(const std::vector<std::string>& args);
28 const std::vector<std::string>& args);
29absl::Status HandleLearnCommand(const std::vector<std::string>& args);
30absl::Status HandleListCommand();
31absl::Status HandleDiffCommand(Rom& rom, const std::vector<std::string>& args);
32absl::Status HandleCommitCommand(Rom& rom);
33absl::Status HandleRevertCommand(Rom& rom);
34absl::Status HandleAcceptCommand(const std::vector<std::string>& args,
35 Rom& rom);
36absl::Status HandleDescribeCommand(const std::vector<std::string>& args);
37} // namespace agent
38
39namespace {
40
42 static Rom rom;
43 return rom;
44}
45
46std::string GenerateAgentHelp() {
47 auto& registry = CommandRegistry::Instance();
48
49 std::ostringstream help;
50 help << "Usage: agent <subcommand> [options]\n\n";
51
52 help << "AI-Powered Agent Commands:\n";
53 help << " simple-chat Interactive AI chat\n";
54 help << " test-conversation Automated test conversation\n";
55 help << " plan Generate execution plan\n";
56 help << " run Execute plan in sandbox\n";
57 help << " diff Review the latest proposal diff\n";
58 help << " accept Apply proposal changes to ROM\n";
59 help << " commit Save current ROM changes\n";
60 help << " revert Reload ROM from disk\n";
61 help << " learn Manage learned knowledge\n";
62 help << " todo Task management\n";
63 help << " test Run tests\n";
64 help << " list/describe List/describe proposals\n\n";
65
66 // Auto-list available tool commands from registry
67 help << "Tool Commands (AI can call these):\n";
68 auto agent_commands = registry.GetAgentCommands();
69 const size_t preview_count = std::min<size_t>(10, agent_commands.size());
70 for (size_t i = 0; i < preview_count; ++i) {
71 const auto& cmd = agent_commands[i];
72 if (auto* meta = registry.GetMetadata(cmd); meta != nullptr) {
73 help << " " << cmd;
74 for (size_t pad = cmd.length(); pad < 24; ++pad)
75 help << " ";
76 help << meta->description << "\n";
77 }
78 }
79 if (agent_commands.size() > preview_count) {
80 help << " ... and " << (agent_commands.size() - preview_count)
81 << " more (see z3ed --list-commands)\n";
82 }
83 help << "\n";
84
85 help << "Global Options:\n";
86 help << " --rom=<path> Path to ROM file\n";
87 help << " --ai_provider=<name> AI provider: ollama | gemini\n";
88 help << " --format=<type> Output format: text | json\n\n";
89
90 help << "For detailed help: z3ed agent <command> --help\n";
91 help << "For all commands: z3ed --list-commands\n";
92
93 return help.str();
94}
95
96constexpr absl::string_view kUsage = "";
97
98} // namespace
99
100namespace handlers {
101
110absl::Status HandleAgentCommand(const std::vector<std::string>& arg_vec) {
111 if (arg_vec.empty()) {
112 std::cout << GenerateAgentHelp();
113 return absl::InvalidArgumentError("No subcommand specified");
114 }
115
116 const std::string& subcommand = arg_vec[0];
117 std::vector<std::string> subcommand_args(arg_vec.begin() + 1, arg_vec.end());
118
119 // === Special Agent Commands (not in registry) ===
120
121 if (subcommand == "simple-chat" || subcommand == "chat") {
122 auto& registry = CommandRegistry::Instance();
123 return registry.Execute("simple-chat", subcommand_args, nullptr);
124 }
125
126 auto& agent_rom = AgentRom();
127
128 if (subcommand == "run") {
129 return agent::HandleRunCommand(subcommand_args, agent_rom);
130 }
131
132 if (subcommand == "plan") {
133 return agent::HandlePlanCommand(subcommand_args);
134 }
135
136 if (subcommand == "diff") {
137 return agent::HandleDiffCommand(agent_rom, subcommand_args);
138 }
139
140 if (subcommand == "accept") {
141 return agent::HandleAcceptCommand(subcommand_args, agent_rom);
142 }
143
144 if (subcommand == "commit") {
145 return agent::HandleCommitCommand(agent_rom);
146 }
147
148 if (subcommand == "revert") {
149 return agent::HandleRevertCommand(agent_rom);
150 }
151
152 if (subcommand == "test") {
153 return agent::HandleTestCommand(subcommand_args);
154 }
155
156 if (subcommand == "test-conversation") {
157 return agent::HandleTestConversationCommand(subcommand_args);
158 }
159
160 if (subcommand == "gui") {
161 // GUI commands are in the registry (gui-place-tile, gui-click, etc.)
162 // Route to registry instead
163 return absl::InvalidArgumentError(
164 "Use 'z3ed gui-<command>' or see 'z3ed --help gui' for available GUI "
165 "automation commands");
166 }
167
168 if (subcommand == "learn") {
169 return agent::HandleLearnCommand(subcommand_args);
170 }
171
172 if (subcommand == "todo") {
173 return handlers::HandleTodoCommand(subcommand_args);
174 }
175
176 if (subcommand == "list") {
178 }
179
180 if (subcommand == "describe") {
181 return agent::HandleDescribeCommand(subcommand_args);
182 }
183
184 // === Registry Commands (resource, dungeon, overworld, emulator, etc.) ===
185
186 auto& registry = CommandRegistry::Instance();
187
188 // Check if this is a registered command
189 if (registry.HasCommand(subcommand)) {
190 return registry.Execute(subcommand, subcommand_args, nullptr);
191 }
192
193 // Not found
194 std::cout << GenerateAgentHelp();
195 return absl::InvalidArgumentError(
196 absl::StrCat("Unknown agent command: ", subcommand));
197}
198
199// Handler implementations live in general_commands.cc
200
201} // namespace handlers
202} // namespace cli
203} // namespace yaze
ABSL_DECLARE_FLAG(bool, quiet)
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
static CommandRegistry & Instance()
absl::Status HandleLearnCommand(const std::vector< std::string > &args)
absl::Status HandleAcceptCommand(const std::vector< std::string > &args, Rom &rom)
absl::Status HandleTestConversationCommand(const std::vector< std::string > &args)
absl::Status HandleRunCommand(const std::vector< std::string > &args, Rom &rom)
absl::Status HandleTestCommand(const std::vector< std::string > &args)
absl::Status HandleCommitCommand(Rom &rom)
absl::Status HandleDescribeCommand(const std::vector< std::string > &args)
absl::Status HandleDiffCommand(Rom &rom, const std::vector< std::string > &args)
absl::Status HandleRevertCommand(Rom &rom)
absl::Status HandleListCommand()
absl::Status HandlePlanCommand(const std::vector< std::string > &args)
constexpr absl::string_view kUsage
Definition agent.cc:96
absl::Status HandleTestConversationCommand(const std::vector< std::string > &)
absl::Status HandleAcceptCommand(const std::vector< std::string > &, Rom &)
absl::Status HandleLearnCommand(const std::vector< std::string > &)
absl::Status HandleRunCommand(const std::vector< std::string > &, Rom &)
absl::Status HandleCommitCommand(Rom &)
absl::Status HandleRevertCommand(Rom &)
absl::Status HandleTestCommand(const std::vector< std::string > &)
std::string GenerateAgentHelp()
absl::Status HandleAgentCommand(const std::vector< std::string > &args)
Unified agent command handler using CommandRegistry.
Definition agent.cc:110
absl::Status HandleTodoCommand(const std::vector< std::string > &args)
Handle z3ed agent todo commands.