8#include "absl/status/status.h"
9#include "absl/strings/str_cat.h"
10#include "absl/strings/str_join.h"
44 return absl::FailedPreconditionError(
45 "AI Service not initialized. Please set an API key using the settings menu.");
49 return absl::InvalidArgumentError(
"Please provide a message. Usage: agent chat <message>");
52 std::string prompt = absl::StrJoin(args,
" ");
64 std::cout <<
"Thinking... (This may take a few seconds)" << std::endl;
67 std::thread([service]() {
68 std::vector<agent::ChatMessage> history_copy;
75 auto response_or = service->GenerateResponse(history_copy);
77 if (!response_or.ok()) {
78 std::cerr <<
"\nError: " << response_or.status().message() <<
"\n" << std::endl;
88 auto response = response_or.value();
95 agent_msg.
message = response.text_response;
102 std::cout <<
"\nAgent: " << response.text_response <<
"\n" << std::endl;
105 return absl::OkStatus();
108absl::Status HandlePlanCommand(
const std::vector<std::string>& args) {
111 return absl::FailedPreconditionError(
"AI Service not initialized.");
115 return absl::InvalidArgumentError(
"Usage: agent plan <task description>");
118 std::string task = absl::StrJoin(args,
" ");
119 std::string prompt =
"Create a detailed step-by-step implementation plan for the following ROM hacking task. "
120 "Do not execute it yet, just plan it.\nTask: " + task;
122 std::cout <<
"Generating plan... (Check back in a moment)" << std::endl;
124 std::thread([service, prompt]() {
125 auto response_or = service->GenerateResponse(prompt);
126 if (!response_or.ok()) {
127 std::cerr <<
"\nPlan Error: " << response_or.status().message() <<
"\n" << std::endl;
132 std::lock_guard<std::mutex> lock(g_plan_mutex);
133 g_pending_plan = response_or.value().text_response;
136 std::cout <<
"\nProposed Plan Ready:\n" << std::string(40,
'-') <<
"\n";
137 std::cout << response_or.value().text_response <<
"\n" << std::string(40,
'-') <<
"\n";
138 std::cout <<
"Run 'agent diff' to review this plan again.\n" << std::endl;
141 return absl::OkStatus();
144absl::Status HandleDiffCommand(
Rom&,
const std::vector<std::string>&) {
147 return absl::NotFoundError(
"No pending plan found. Run 'agent plan <task>' first.");
150 std::cout <<
"\nPending Plan (Conceptual Diff):\n" << std::string(40,
'-') <<
"\n";
151 std::cout <<
g_pending_plan <<
"\n" << std::string(40,
'-') <<
"\n";
153 return absl::OkStatus();
156absl::Status HandleListCommand(
const std::vector<std::string>& ) {
158 std::ostringstream oss;
160 oss <<
"Available Resources:\n";
161 for (
const auto& resource : catalog.AllResources()) {
162 oss <<
" - " << resource.resource <<
": " << resource.description <<
"\n";
165 std::cout << oss.str() << std::endl;
166 return absl::OkStatus();
169absl::Status HandleDescribeCommand(
const std::vector<std::string>& args) {
171 return absl::InvalidArgumentError(
"Usage: agent describe <resource_name>");
174 const std::string&
name = args[0];
176 auto resource_or = catalog.GetResource(
name);
178 if (!resource_or.ok()) {
179 return resource_or.status();
182 const auto& resource = resource_or.value();
183 std::string json_output = catalog.SerializeResource(resource);
185 std::cout <<
"Description of " <<
name <<
":\n";
186 std::cout << json_output << std::endl;
188 return absl::OkStatus();
197 return absl::UnimplementedError(
"Agent run command not available in browser yet");
203 return absl::UnimplementedError(
"Agent commit command not available in browser yet");
206 return absl::UnimplementedError(
"Agent revert command not available in browser yet");
209 return absl::UnimplementedError(
"Agent accept command not available in browser yet");
212 return absl::UnimplementedError(
"Agent test command not available in browser");
215 return absl::UnimplementedError(
"Agent test-conversation command not available in browser");
218 return absl::UnimplementedError(
"Agent learn command not available in browser");
223 return "Available Agent Commands (Browser):\n"
224 " todo - Manage todo list\n"
225 " chat <message> - Chat with the AI agent\n"
226 " list - List available resources\n"
227 " describe <name> - Describe a specific resource\n"
228 " plan <task> - Generate an implementation plan\n"
229 " diff - View pending plan/changes\n";
238 if (arg_vec.empty()) {
240 return absl::InvalidArgumentError(
"No subcommand specified");
243 const std::string& subcommand = arg_vec[0];
244 std::vector<std::string> subcommand_args(arg_vec.begin() + 1, arg_vec.end());
246 if (subcommand ==
"simple-chat" || subcommand ==
"chat") {
247 return HandleChatCommand(subcommand_args);
250 if (subcommand ==
"plan") {
251 return HandlePlanCommand(subcommand_args);
254 if (subcommand ==
"diff") {
259 if (subcommand ==
"todo") {
263 if (subcommand ==
"list") {
267 if (subcommand ==
"describe") {
272 return absl::InvalidArgumentError(absl::StrCat(
"Unknown subcommand: ", subcommand));
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
static const ResourceCatalog & Instance()
absl::Status HandleDescribeCommand(const std::vector< std::string > &args)
absl::Status HandleDiffCommand(Rom &rom, const std::vector< std::string > &args)
absl::Status HandleListCommand()
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::vector< agent::ChatMessage > g_chat_history
absl::Status HandleChatCommand(const std::vector< std::string > &args)
std::string g_pending_plan
std::string GenerateAgentHelp()
absl::Status HandleAgentCommand(const std::vector< std::string > &args)
Unified agent command handler using CommandRegistry.
absl::Status HandleTodoCommand(const std::vector< std::string > &args)
Handle z3ed agent todo commands.
BrowserAIService * GetGlobalBrowserAIService()