8#include "absl/status/status.h"
9#include "absl/strings/str_cat.h"
10#include "absl/strings/str_join.h"
11#include "absl/time/clock.h"
45 return absl::FailedPreconditionError(
46 "AI Service not initialized. Please set an API key using the settings "
51 return absl::InvalidArgumentError(
52 "Please provide a message. Usage: agent chat <message>");
55 std::string prompt = absl::StrJoin(args,
" ");
67 std::cout <<
"Thinking... (This may take a few seconds)" << std::endl;
70 std::thread([service]() {
71 std::vector<agent::ChatMessage> history_copy;
78 auto response_or = service->GenerateResponse(history_copy);
80 if (!response_or.ok()) {
81 std::cerr <<
"\nError: " << response_or.status().message() <<
"\n"
92 auto response = response_or.value();
99 agent_msg.
message = response.text_response;
106 std::cout <<
"\nAgent: " << response.text_response <<
"\n" << std::endl;
109 return absl::OkStatus();
112absl::Status HandlePlanCommand(
const std::vector<std::string>& args) {
115 return absl::FailedPreconditionError(
"AI Service not initialized.");
119 return absl::InvalidArgumentError(
"Usage: agent plan <task description>");
122 std::string task = absl::StrJoin(args,
" ");
124 "Create a detailed step-by-step implementation plan for the following "
126 "Do not execute it yet, just plan it.\nTask: " +
129 std::cout <<
"Generating plan... (Check back in a moment)" << std::endl;
131 std::thread([service, prompt]() {
132 auto response_or = service->GenerateResponse(prompt);
133 if (!response_or.ok()) {
134 std::cerr <<
"\nPlan Error: " << response_or.status().message() <<
"\n"
140 std::lock_guard<std::mutex> lock(g_plan_mutex);
141 g_pending_plan = response_or.value().text_response;
144 std::cout <<
"\nProposed Plan Ready:\n" << std::string(40,
'-') <<
"\n";
145 std::cout << response_or.value().text_response <<
"\n"
146 << std::string(40,
'-') <<
"\n";
147 std::cout <<
"Run 'agent diff' to review this plan again.\n" << std::endl;
150 return absl::OkStatus();
153absl::Status HandleDiffCommand(
Rom&,
const std::vector<std::string>&) {
156 return absl::NotFoundError(
157 "No pending plan found. Run 'agent plan <task>' first.");
160 std::cout <<
"\nPending Plan (Conceptual Diff):\n"
161 << std::string(40,
'-') <<
"\n";
162 std::cout <<
g_pending_plan <<
"\n" << std::string(40,
'-') <<
"\n";
164 return absl::OkStatus();
167absl::Status HandleListCommand(
const std::vector<std::string>& ) {
169 std::ostringstream oss;
171 oss <<
"Available Resources:\n";
172 for (
const auto& resource : catalog.AllResources()) {
173 oss <<
" - " << resource.resource <<
": " << resource.description <<
"\n";
176 std::cout << oss.str() << std::endl;
177 return absl::OkStatus();
180absl::Status HandleDescribeCommand(
const std::vector<std::string>& args) {
182 return absl::InvalidArgumentError(
"Usage: agent describe <resource_name>");
185 const std::string&
name = args[0];
187 auto resource_or = catalog.GetResource(
name);
189 if (!resource_or.ok()) {
190 return resource_or.status();
193 const auto& resource = resource_or.value();
194 std::string json_output = catalog.SerializeResource(resource);
196 std::cout <<
"Description of " <<
name <<
":\n";
197 std::cout << json_output << std::endl;
199 return absl::OkStatus();
208 return absl::UnimplementedError(
209 "Agent run command not available in browser yet");
215 return absl::UnimplementedError(
216 "Agent commit command not available in browser yet");
219 return absl::UnimplementedError(
220 "Agent revert command not available in browser yet");
223 return absl::UnimplementedError(
224 "Agent accept command not available in browser yet");
227 return absl::UnimplementedError(
228 "Agent test command not available in browser");
231 return absl::UnimplementedError(
232 "Agent test-conversation command not available in browser");
235 return absl::UnimplementedError(
236 "Agent learn command not available in browser");
241 return "Available Agent Commands (Browser):\n"
242 " todo - Manage todo list\n"
243 " chat <message> - Chat with the AI agent\n"
244 " list - List available resources\n"
245 " describe <name> - Describe a specific resource\n"
246 " plan <task> - Generate an implementation plan\n"
247 " diff - View pending plan/changes\n";
256 if (arg_vec.empty()) {
258 return absl::InvalidArgumentError(
"No subcommand specified");
261 const std::string& subcommand = arg_vec[0];
262 std::vector<std::string> subcommand_args(arg_vec.begin() + 1, arg_vec.end());
264 if (subcommand ==
"simple-chat" || subcommand ==
"chat") {
265 return HandleChatCommand(subcommand_args);
268 if (subcommand ==
"plan") {
269 return HandlePlanCommand(subcommand_args);
272 if (subcommand ==
"diff") {
277 if (subcommand ==
"todo") {
281 if (subcommand ==
"list") {
285 if (subcommand ==
"describe") {
290 return absl::InvalidArgumentError(
291 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()