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