From 90ddc3d50c7d98bde15d625fe76a2f1d1a1d38e2 Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 3 Oct 2025 09:54:27 -0400 Subject: [PATCH] Refactor CLI Service Structure and Enhance AI Integration - Restructured CLI service source files to improve organization, moving files into dedicated directories for better maintainability. - Introduced new AI service components, including `AIService`, `MockAIService`, and `GeminiAIService`, to facilitate natural language command generation. - Implemented `PolicyEvaluator` and `ProposalRegistry` for enhanced proposal management and policy enforcement in AI workflows. - Updated CMake configurations to reflect new file paths and ensure proper linking of the restructured components. - Enhanced test suite with new test workflow generation capabilities, improving the robustness of automated testing. This commit significantly advances the architecture of the z3ed system, laying the groundwork for more sophisticated AI-driven features and streamlined development processes. --- src/CMakeLists.txt | 8 +- src/app/app.cmake | 12 +- src/app/editor/system/proposal_drawer.cc | 4 +- src/app/editor/system/proposal_drawer.h | 2 +- src/app/emu/emu.cmake | 8 +- src/cli/handlers/agent.cc | 5 +- src/cli/handlers/agent/commands.h | 1 + src/cli/handlers/agent/common.h | 2 +- src/cli/handlers/agent/general_commands.cc | 218 ++++++++++-------- src/cli/handlers/agent/gui_commands.cc | 2 +- src/cli/handlers/agent/test_commands.cc | 4 +- src/cli/service/{ => ai}/ai_service.cc | 2 +- src/cli/service/{ => ai}/ai_service.h | 0 src/cli/service/{ => ai}/gemini_ai_service.cc | 2 +- src/cli/service/{ => ai}/gemini_ai_service.h | 4 +- src/cli/service/{ => ai}/ollama_ai_service.cc | 2 +- src/cli/service/{ => ai}/ollama_ai_service.h | 4 +- src/cli/service/{ => ai}/prompt_builder.cc | 17 +- src/cli/service/{ => ai}/prompt_builder.h | 6 + .../{ => gui}/gui_automation_client.cc | 2 +- .../service/{ => gui}/gui_automation_client.h | 0 .../{ => planning}/policy_evaluator.cc | 4 +- .../service/{ => planning}/policy_evaluator.h | 0 .../{ => planning}/proposal_registry.cc | 2 +- .../{ => planning}/proposal_registry.h | 0 .../tile16_proposal_generator.cc | 2 +- .../tile16_proposal_generator.h | 0 .../{ => resources}/resource_catalog.cc | 2 +- .../{ => resources}/resource_catalog.h | 0 .../resource_context_builder.cc | 2 +- .../resource_context_builder.h | 0 .../service/{ => rom}/rom_sandbox_manager.cc | 2 +- .../service/{ => rom}/rom_sandbox_manager.h | 0 src/cli/service/{ => testing}/test_suite.h | 2 +- .../{ => testing}/test_suite_loader.cc | 2 +- .../service/{ => testing}/test_suite_loader.h | 2 +- .../{ => testing}/test_suite_reporter.cc | 2 +- .../{ => testing}/test_suite_reporter.h | 2 +- .../{ => testing}/test_suite_writer.cc | 2 +- .../service/{ => testing}/test_suite_writer.h | 2 +- .../{ => testing}/test_workflow_generator.cc | 2 +- .../{ => testing}/test_workflow_generator.h | 0 src/cli/z3ed.cmake | 50 ++-- test/CMakeLists.txt | 4 +- test/unit/cli/resource_catalog_test.cc | 2 +- 45 files changed, 224 insertions(+), 167 deletions(-) rename src/cli/service/{ => ai}/ai_service.cc (96%) rename src/cli/service/{ => ai}/ai_service.h (100%) rename src/cli/service/{ => ai}/gemini_ai_service.cc (99%) rename src/cli/service/{ => ai}/gemini_ai_service.h (93%) rename src/cli/service/{ => ai}/ollama_ai_service.cc (99%) rename src/cli/service/{ => ai}/ollama_ai_service.h (95%) rename src/cli/service/{ => ai}/prompt_builder.cc (96%) rename src/cli/service/{ => ai}/prompt_builder.h (90%) rename src/cli/service/{ => gui}/gui_automation_client.cc (99%) rename src/cli/service/{ => gui}/gui_automation_client.h (100%) rename src/cli/service/{ => planning}/policy_evaluator.cc (99%) rename src/cli/service/{ => planning}/policy_evaluator.h (100%) rename src/cli/service/{ => planning}/proposal_registry.cc (99%) rename src/cli/service/{ => planning}/proposal_registry.h (100%) rename src/cli/service/{ => planning}/tile16_proposal_generator.cc (99%) rename src/cli/service/{ => planning}/tile16_proposal_generator.h (100%) rename src/cli/service/{ => resources}/resource_catalog.cc (99%) rename src/cli/service/{ => resources}/resource_catalog.h (100%) rename src/cli/service/{ => resources}/resource_context_builder.cc (99%) rename src/cli/service/{ => resources}/resource_context_builder.h (100%) rename src/cli/service/{ => rom}/rom_sandbox_manager.cc (99%) rename src/cli/service/{ => rom}/rom_sandbox_manager.h (100%) rename src/cli/service/{ => testing}/test_suite.h (97%) rename src/cli/service/{ => testing}/test_suite_loader.cc (99%) rename src/cli/service/{ => testing}/test_suite_loader.h (91%) rename src/cli/service/{ => testing}/test_suite_reporter.cc (99%) rename src/cli/service/{ => testing}/test_suite_reporter.h (92%) rename src/cli/service/{ => testing}/test_suite_writer.cc (99%) rename src/cli/service/{ => testing}/test_suite_writer.h (94%) rename src/cli/service/{ => testing}/test_workflow_generator.cc (99%) rename src/cli/service/{ => testing}/test_workflow_generator.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a16a5eb6..3cada243 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -172,10 +172,10 @@ if (YAZE_BUILD_LIB) ${YAZE_GUI_SRC} ${YAZE_UTIL_SRC} # CLI service sources (needed for ProposalDrawer) - cli/service/proposal_registry.cc - cli/service/rom_sandbox_manager.cc + cli/service/planning/proposal_registry.cc + cli/service/rom/rom_sandbox_manager.cc # cli/service/gui_automation_client.cc # Moved to yaze_c - cli/service/test_workflow_generator.cc + cli/service/testing/test_workflow_generator.cc ) # Create full library for C API @@ -184,7 +184,7 @@ if (YAZE_BUILD_LIB) ${YAZE_CORE_SOURCES} ${YAZE_GUI_SRC} ${IMGUI_SRC} - cli/service/gui_automation_client.cc + cli/service/gui/gui_automation_client.cc ) # Add emulator sources (required for comprehensive testing) diff --git a/src/app/app.cmake b/src/app/app.cmake index c14d9336..213451b5 100644 --- a/src/app/app.cmake +++ b/src/app/app.cmake @@ -19,9 +19,9 @@ if (APPLE) ${YAZE_GUI_SRC} ${IMGUI_SRC} # CLI service sources (needed for ProposalDrawer) - cli/service/proposal_registry.cc - cli/service/rom_sandbox_manager.cc - cli/service/policy_evaluator.cc + cli/service/planning/proposal_registry.cc + cli/service/rom/rom_sandbox_manager.cc + cli/service/planning/policy_evaluator.cc # Bundled Resources ${YAZE_RESOURCE_FILES} ) @@ -58,9 +58,9 @@ else() ${YAZE_GUI_SRC} ${IMGUI_SRC} # CLI service sources (needed for ProposalDrawer) - cli/service/proposal_registry.cc - cli/service/rom_sandbox_manager.cc - cli/service/policy_evaluator.cc + cli/service/planning/proposal_registry.cc + cli/service/rom/rom_sandbox_manager.cc + cli/service/planning/policy_evaluator.cc ) # Add asset files for Windows/Linux builds diff --git a/src/app/editor/system/proposal_drawer.cc b/src/app/editor/system/proposal_drawer.cc index 0a68066b..5adf4d86 100644 --- a/src/app/editor/system/proposal_drawer.cc +++ b/src/app/editor/system/proposal_drawer.cc @@ -8,11 +8,11 @@ #include "absl/time/time.h" #include "imgui/imgui.h" #include "app/gui/icons.h" -#include "cli/service/rom_sandbox_manager.h" +#include "cli/service/rom/rom_sandbox_manager.h" // Policy evaluation support (optional, only in main yaze build) #ifdef YAZE_ENABLE_POLICY_FRAMEWORK -#include "cli/service/policy_evaluator.h" +#include "cli/service/planning/policy_evaluator.h" #endif namespace yaze { diff --git a/src/app/editor/system/proposal_drawer.h b/src/app/editor/system/proposal_drawer.h index deb861c7..16ea05bf 100644 --- a/src/app/editor/system/proposal_drawer.h +++ b/src/app/editor/system/proposal_drawer.h @@ -5,7 +5,7 @@ #include #include "absl/status/status.h" -#include "cli/service/proposal_registry.h" +#include "cli/service/planning/proposal_registry.h" namespace yaze { class Rom; diff --git a/src/app/emu/emu.cmake b/src/app/emu/emu.cmake index cad48496..21b533c8 100644 --- a/src/app/emu/emu.cmake +++ b/src/app/emu/emu.cmake @@ -15,8 +15,8 @@ if (NOT YAZE_MINIMAL_BUILD AND APPLE) ${YAZE_GUI_SRC} ${IMGUI_SRC} # CLI service sources (needed for ProposalDrawer) - cli/service/proposal_registry.cc - cli/service/rom_sandbox_manager.cc + cli/service/planning/proposal_registry.cc + cli/service/rom/rom_sandbox_manager.cc ) target_link_libraries(yaze_emu PUBLIC ${COCOA_LIBRARY}) elseif(NOT YAZE_MINIMAL_BUILD) @@ -33,8 +33,8 @@ elseif(NOT YAZE_MINIMAL_BUILD) ${YAZE_GUI_SRC} ${IMGUI_SRC} # CLI service sources (needed for ProposalDrawer) - cli/service/proposal_registry.cc - cli/service/rom_sandbox_manager.cc + cli/service/planning/proposal_registry.cc + cli/service/rom/rom_sandbox_manager.cc ) endif() diff --git a/src/cli/handlers/agent.cc b/src/cli/handlers/agent.cc index 55b9e36a..ce4066f9 100644 --- a/src/cli/handlers/agent.cc +++ b/src/cli/handlers/agent.cc @@ -12,7 +12,7 @@ namespace agent { namespace { constexpr absl::string_view kUsage = - "Usage: agent " + "Usage: agent " "[options]"; } // namespace @@ -35,6 +35,9 @@ absl::Status Agent::Run(const std::vector& arg_vec) { if (subcommand == "diff") { return agent::HandleDiffCommand(rom_, subcommand_args); } + if (subcommand == "accept") { + return agent::HandleAcceptCommand(subcommand_args, rom_); + } if (subcommand == "test") { return agent::HandleTestCommand(subcommand_args); } diff --git a/src/cli/handlers/agent/commands.h b/src/cli/handlers/agent/commands.h index 4ea01310..8b42972d 100644 --- a/src/cli/handlers/agent/commands.h +++ b/src/cli/handlers/agent/commands.h @@ -17,6 +17,7 @@ absl::Status HandleRunCommand(const std::vector& args, absl::Status HandlePlanCommand(const std::vector& args); absl::Status HandleDiffCommand(Rom& rom, const std::vector& args); +absl::Status HandleAcceptCommand(const std::vector& args, Rom& rom); absl::Status HandleTestCommand(const std::vector& args); absl::Status HandleGuiCommand(const std::vector& args); absl::Status HandleLearnCommand(); diff --git a/src/cli/handlers/agent/common.h b/src/cli/handlers/agent/common.h index cf60f307..45e06b99 100644 --- a/src/cli/handlers/agent/common.h +++ b/src/cli/handlers/agent/common.h @@ -5,7 +5,7 @@ #include #include "absl/time/time.h" -#include "cli/service/gui_automation_client.h" +#include "cli/service/gui/gui_automation_client.h" namespace yaze { namespace cli { diff --git a/src/cli/handlers/agent/general_commands.cc b/src/cli/handlers/agent/general_commands.cc index c0b512e5..b34902c9 100644 --- a/src/cli/handlers/agent/general_commands.cc +++ b/src/cli/handlers/agent/general_commands.cc @@ -18,12 +18,13 @@ #include "absl/strings/str_replace.h" #include "cli/handlers/agent/common.h" #include "cli/modern_cli.h" -#include "cli/service/ai_service.h" -#include "cli/service/ollama_ai_service.h" -#include "cli/service/gemini_ai_service.h" -#include "cli/service/proposal_registry.h" -#include "cli/service/resource_catalog.h" -#include "cli/service/rom_sandbox_manager.h" +#include "cli/service/ai/ai_service.h" +#include "cli/service/ai/ollama_ai_service.h" +#include "cli/service/ai/gemini_ai_service.h" +#include "cli/service/planning/proposal_registry.h" +#include "cli/service/planning/tile16_proposal_generator.h" +#include "cli/service/resources/resource_catalog.h" +#include "cli/service/rom/rom_sandbox_manager.h" #include "cli/z3ed.h" #include "util/macro.h" @@ -174,109 +175,84 @@ absl::Status HandleRunCommand(const std::vector& arg_vec, if (rom_path.empty()) { return absl::FailedPreconditionError( "No ROM loaded. Use --rom= to specify ROM file.\n" - "Example: z3ed agent run --rom=zelda3.sfc --prompt \"Your prompt here\""); + "Example: z3ed agent run --rom=zelda3.sfc --prompt \"Your prompt " + "here\""); } auto status = rom.LoadFromFile(rom_path); if (!status.ok()) { - return absl::FailedPreconditionError( - absl::StrFormat("Failed to load ROM from '%s': %s", rom_path, - status.message())); + return absl::FailedPreconditionError(absl::StrFormat( + "Failed to load ROM from '%s': %s", rom_path, status.message())); } } - auto sandbox_or = RomSandboxManager::Instance().CreateSandbox(rom, - "agent-run"); + // 1. Create a sandbox ROM to apply changes to + auto sandbox_or = + RomSandboxManager::Instance().CreateSandbox(rom, "agent-run"); if (!sandbox_or.ok()) { return sandbox_or.status(); } auto sandbox = sandbox_or.value(); - auto proposal_or = ProposalRegistry::Instance().CreateProposal( - sandbox.id, prompt, "Agent-generated ROM modifications"); + // 2. Get commands from the AI service + auto ai_service = CreateAIService(); // Use service factory + auto commands_or = ai_service->GetCommands(prompt); + if (!commands_or.ok()) { + return commands_or.status(); + } + std::vector commands = commands_or.value(); + + // 3. Generate a structured proposal from the commands + Tile16ProposalGenerator generator; + auto proposal_or = generator.GenerateFromCommands( + prompt, commands, "ollama", &rom); // Pass original ROM to get old tiles if (!proposal_or.ok()) { return proposal_or.status(); } auto proposal = proposal_or.value(); - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, absl::StrCat("Starting agent run with prompt: ", prompt))); - - auto ai_service = CreateAIService(); // Use service factory - auto commands_or = ai_service->GetCommands(prompt); - if (!commands_or.ok()) { - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, - absl::StrCat("AI service error: ", commands_or.status().message()))); - return commands_or.status(); - } - std::vector commands = commands_or.value(); - - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, absl::StrCat("Generated ", commands.size(), - " commands"))); - - ModernCLI cli; - int commands_executed = 0; - for (const auto& command : commands) { - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, absl::StrCat("Executing: ", command))); - - std::vector command_parts; - std::string current_part; - bool in_quotes = false; - for (char c : command) { - if (c == '"') { - in_quotes = !in_quotes; - } else if (c == ' ' && !in_quotes) { - command_parts.push_back(current_part); - current_part.clear(); - } else { - current_part += c; - } - } - command_parts.push_back(current_part); - - if (command_parts.size() < 2) { - auto error_msg = absl::StrFormat("Malformed command: %s", command); - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog(proposal.id, - error_msg)); - return absl::InvalidArgumentError(error_msg); - } - - std::string cmd_name = command_parts[0] + " " + command_parts[1]; - std::vector cmd_args(command_parts.begin() + 2, - command_parts.end()); - - auto it = cli.commands_.find(cmd_name); - if (it != cli.commands_.end()) { - auto status = it->second.handler(cmd_args); - if (!status.ok()) { - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, absl::StrCat("Command failed: ", status.message()))); - return status; - } - commands_executed++; - RETURN_IF_ERROR( - ProposalRegistry::Instance().AppendLog(proposal.id, - "Command succeeded")); - } else { - auto error_msg = absl::StrCat("Unknown command: ", cmd_name); - RETURN_IF_ERROR( - ProposalRegistry::Instance().AppendLog(proposal.id, error_msg)); - return absl::NotFoundError(error_msg); - } + // 4. Apply the proposal to the sandbox ROM for preview + Rom sandbox_rom; + auto load_status = sandbox_rom.LoadFromFile(sandbox.rom_path.string()); + if (!load_status.ok()) { + return absl::InternalError(absl::StrCat( + "Failed to load sandbox ROM: ", load_status.message())); } - RETURN_IF_ERROR(ProposalRegistry::Instance().AppendLog( - proposal.id, - absl::StrCat("Completed execution of ", commands_executed, - " commands"))); + auto apply_status = generator.ApplyProposal(proposal, &sandbox_rom); + if (!apply_status.ok()) { + return absl::InternalError( + absl::StrCat("Failed to apply proposal to sandbox ROM: ", + apply_status.message())); + } - std::cout << "✅ Agent run completed successfully." << std::endl; + // 5. Save the sandbox ROM to persist the changes for diffing + auto save_status = sandbox_rom.SaveToFile({.save_new = false}); + if (!save_status.ok()) { + return absl::InternalError( + absl::StrCat("Failed to save sandbox ROM: ", save_status.message())); + } + + // 6. Save the proposal metadata for later use (accept/reject) + // For now, we'll just use the proposal generator's save function. + // A better approach would be to integrate with ProposalRegistry. + auto proposal_path = + RomSandboxManager::Instance().RootDirectory() / (proposal.id + ".json"); + auto save_proposal_status = generator.SaveProposal(proposal, proposal_path.string()); + if (!save_proposal_status.ok()) { + return absl::InternalError(absl::StrCat("Failed to save proposal file: ", + save_proposal_status.message())); + } + + std::cout << "✅ Agent successfully planned and executed changes in a sandbox." + << std::endl; std::cout << " Proposal ID: " << proposal.id << std::endl; - std::cout << " Sandbox: " << sandbox.rom_path << std::endl; - std::cout << " Use 'z3ed agent diff' to review changes" << std::endl; + std::cout << " Sandbox ROM: " << sandbox.rom_path << std::endl; + std::cout << " Proposal file: " << proposal_path << std::endl; + std::cout << "\nTo review the changes, run:\n"; + std::cout << " z3ed agent diff --proposal-id " << proposal.id << std::endl; + std::cout << "\nTo accept the changes, run:\n"; + std::cout << " z3ed agent accept --proposal-id " << proposal.id << std::endl; return absl::OkStatus(); } @@ -294,10 +270,20 @@ absl::Status HandlePlanCommand(const std::vector& arg_vec) { } std::vector commands = commands_or.value(); - std::cout << "AI Agent Plan:" << std::endl; - for (const auto& command : commands) { - std::cout << " - " << command << std::endl; + // Create a proposal from the commands + Tile16ProposalGenerator generator; + auto proposal_or = + generator.GenerateFromCommands(prompt, commands, "ollama", nullptr); + if (!proposal_or.ok()) { + return proposal_or.status(); } + auto proposal = proposal_or.value(); + + // TODO: Save the proposal to disk using ProposalRegistry + // For now, just print it. + std::cout << "AI Agent Plan (Proposal ID: " << proposal.id << "):\n"; + std::cout << proposal.ToJson() << std::endl; + return absl::OkStatus(); } @@ -542,6 +528,56 @@ absl::Status HandleDescribeCommand(const std::vector& arg_vec) { return absl::OkStatus(); } +absl::Status HandleAcceptCommand(const std::vector& arg_vec, + Rom& rom) { + if (arg_vec.empty() || arg_vec[0] != "--proposal-id") { + return absl::InvalidArgumentError( + "Usage: agent accept --proposal-id "); + } + std::string proposal_id = arg_vec[1]; + + // 1. Load the proposal from disk. + Tile16ProposalGenerator generator; + auto proposal_path = + RomSandboxManager::Instance().RootDirectory() / (proposal_id + ".json"); + auto proposal_or = generator.LoadProposal(proposal_path.string()); + if (!proposal_or.ok()) { + return absl::InternalError(absl::StrCat("Failed to load proposal file '", + proposal_path.string(), + "': ", proposal_or.status().message())); + } + auto proposal = proposal_or.value(); + + // 2. Ensure the main ROM is loaded. + if (!rom.is_loaded()) { + return absl::FailedPreconditionError( + "No ROM loaded. Use --rom= to specify the ROM to apply changes to."); + } + + // 3. Apply the proposal to the main ROM. + auto apply_status = generator.ApplyProposal(proposal, &rom); + if (!apply_status.ok()) { + return absl::InternalError( + absl::StrCat("Failed to apply proposal to main ROM: ", + apply_status.message())); + } + + // 4. Save the changes to the main ROM file. + auto save_status = rom.SaveToFile({.save_new = false}); + if (!save_status.ok()) { + return absl::InternalError( + absl::StrCat("Failed to save changes to main ROM: ", + save_status.message())); + } + + std::cout << "✅ Proposal '" << proposal_id << "' accepted and applied to '" + << rom.filename() << "'." << std::endl; + + // TODO: Clean up sandbox and proposal files. + + return absl::OkStatus(); +} + } // namespace agent } // namespace cli } // namespace yaze diff --git a/src/cli/handlers/agent/gui_commands.cc b/src/cli/handlers/agent/gui_commands.cc index a6a04839..6c022e33 100644 --- a/src/cli/handlers/agent/gui_commands.cc +++ b/src/cli/handlers/agent/gui_commands.cc @@ -13,7 +13,7 @@ #include "absl/strings/str_format.h" #include "absl/time/time.h" #include "cli/handlers/agent/common.h" -#include "cli/service/gui_automation_client.h" +#include "cli/service/gui/gui_automation_client.h" #include "util/macro.h" namespace yaze { diff --git a/src/cli/handlers/agent/test_commands.cc b/src/cli/handlers/agent/test_commands.cc index 8ee00cf8..20394fc8 100644 --- a/src/cli/handlers/agent/test_commands.cc +++ b/src/cli/handlers/agent/test_commands.cc @@ -9,8 +9,8 @@ #include "cli/handlers/agent/common.h" #ifdef YAZE_WITH_GRPC -#include "cli/service/gui_automation_client.h" -#include "cli/service/test_workflow_generator.h" +#include "cli/service/gui/gui_automation_client.h" +#include "cli/service/testing/test_workflow_generator.h" #endif namespace yaze { diff --git a/src/cli/service/ai_service.cc b/src/cli/service/ai/ai_service.cc similarity index 96% rename from src/cli/service/ai_service.cc rename to src/cli/service/ai/ai_service.cc index e0750f23..45d2b413 100644 --- a/src/cli/service/ai_service.cc +++ b/src/cli/service/ai/ai_service.cc @@ -1,4 +1,4 @@ -#include "cli/service/ai_service.h" +#include "cli/service/ai/ai_service.h" namespace yaze { namespace cli { diff --git a/src/cli/service/ai_service.h b/src/cli/service/ai/ai_service.h similarity index 100% rename from src/cli/service/ai_service.h rename to src/cli/service/ai/ai_service.h diff --git a/src/cli/service/gemini_ai_service.cc b/src/cli/service/ai/gemini_ai_service.cc similarity index 99% rename from src/cli/service/gemini_ai_service.cc rename to src/cli/service/ai/gemini_ai_service.cc index cb41bcaa..42396bbb 100644 --- a/src/cli/service/gemini_ai_service.cc +++ b/src/cli/service/ai/gemini_ai_service.cc @@ -1,4 +1,4 @@ -#include "cli/service/gemini_ai_service.h" +#include "cli/service/ai/gemini_ai_service.h" #include #include diff --git a/src/cli/service/gemini_ai_service.h b/src/cli/service/ai/gemini_ai_service.h similarity index 93% rename from src/cli/service/gemini_ai_service.h rename to src/cli/service/ai/gemini_ai_service.h index c40e9ded..05cfcbdf 100644 --- a/src/cli/service/gemini_ai_service.h +++ b/src/cli/service/ai/gemini_ai_service.h @@ -6,8 +6,8 @@ #include "absl/status/status.h" #include "absl/status/statusor.h" -#include "cli/service/ai_service.h" -#include "cli/service/prompt_builder.h" +#include "cli/service/ai/ai_service.h" +#include "cli/service/ai/prompt_builder.h" namespace yaze { namespace cli { diff --git a/src/cli/service/ollama_ai_service.cc b/src/cli/service/ai/ollama_ai_service.cc similarity index 99% rename from src/cli/service/ollama_ai_service.cc rename to src/cli/service/ai/ollama_ai_service.cc index 28db2e49..91ae66f3 100644 --- a/src/cli/service/ollama_ai_service.cc +++ b/src/cli/service/ai/ollama_ai_service.cc @@ -1,4 +1,4 @@ -#include "cli/service/ollama_ai_service.h" +#include "cli/service/ai/ollama_ai_service.h" #include diff --git a/src/cli/service/ollama_ai_service.h b/src/cli/service/ai/ollama_ai_service.h similarity index 95% rename from src/cli/service/ollama_ai_service.h rename to src/cli/service/ai/ollama_ai_service.h index 2ed3a280..37e33ca8 100644 --- a/src/cli/service/ollama_ai_service.h +++ b/src/cli/service/ai/ollama_ai_service.h @@ -6,8 +6,8 @@ #include "absl/status/status.h" #include "absl/status/statusor.h" -#include "cli/service/ai_service.h" -#include "cli/service/prompt_builder.h" +#include "cli/service/ai/ai_service.h" +#include "cli/service/ai/prompt_builder.h" namespace yaze { namespace cli { diff --git a/src/cli/service/prompt_builder.cc b/src/cli/service/ai/prompt_builder.cc similarity index 96% rename from src/cli/service/prompt_builder.cc rename to src/cli/service/ai/prompt_builder.cc index dceb701c..84023b8d 100644 --- a/src/cli/service/prompt_builder.cc +++ b/src/cli/service/ai/prompt_builder.cc @@ -1,4 +1,4 @@ -#include "cli/service/prompt_builder.h" +#include "cli/service/ai/prompt_builder.h" #include #include @@ -248,9 +248,20 @@ std::string PromptBuilder::BuildConstraintsSection() { std::string PromptBuilder::BuildContextSection(const RomContext& context) { std::ostringstream oss; - + oss << "# Current ROM Context\n\n"; - + + // Use ResourceContextBuilder if a ROM is available + if (rom_ && rom_->is_loaded()) { + if (!resource_context_builder_) { + resource_context_builder_ = std::make_unique(rom_); + } + auto resource_context_or = resource_context_builder_->BuildResourceContext(); + if (resource_context_or.ok()) { + oss << resource_context_or.value(); + } + } + if (context.rom_loaded) { oss << "- **ROM Loaded:** Yes (" << context.rom_path << ")\n"; } else { diff --git a/src/cli/service/prompt_builder.h b/src/cli/service/ai/prompt_builder.h similarity index 90% rename from src/cli/service/prompt_builder.h rename to src/cli/service/ai/prompt_builder.h index 6054d437..e4b3eb03 100644 --- a/src/cli/service/prompt_builder.h +++ b/src/cli/service/ai/prompt_builder.h @@ -6,6 +6,8 @@ #include #include "absl/status/statusor.h" +#include "cli/service/resources/resource_context_builder.h" +#include "app/rom.h" namespace yaze { namespace cli { @@ -30,6 +32,8 @@ class PromptBuilder { public: PromptBuilder(); + void SetRom(Rom* rom) { rom_ = rom; } + // Load z3ed command documentation from resources absl::Status LoadResourceCatalogue(const std::string& yaml_path); @@ -62,6 +66,8 @@ class PromptBuilder { void LoadDefaultExamples(); + Rom* rom_ = nullptr; + std::unique_ptr resource_context_builder_; std::map command_docs_; // Command name -> docs std::vector examples_; int verbosity_ = 1; diff --git a/src/cli/service/gui_automation_client.cc b/src/cli/service/gui/gui_automation_client.cc similarity index 99% rename from src/cli/service/gui_automation_client.cc rename to src/cli/service/gui/gui_automation_client.cc index 5a7c3226..d2cc8e6b 100644 --- a/src/cli/service/gui_automation_client.cc +++ b/src/cli/service/gui/gui_automation_client.cc @@ -1,7 +1,7 @@ // gui_automation_client.cc // Implementation of gRPC client for YAZE GUI automation -#include "cli/service/gui_automation_client.h" +#include "cli/service/gui/gui_automation_client.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" diff --git a/src/cli/service/gui_automation_client.h b/src/cli/service/gui/gui_automation_client.h similarity index 100% rename from src/cli/service/gui_automation_client.h rename to src/cli/service/gui/gui_automation_client.h diff --git a/src/cli/service/policy_evaluator.cc b/src/cli/service/planning/policy_evaluator.cc similarity index 99% rename from src/cli/service/policy_evaluator.cc rename to src/cli/service/planning/policy_evaluator.cc index 4a554857..d26fd842 100644 --- a/src/cli/service/policy_evaluator.cc +++ b/src/cli/service/planning/policy_evaluator.cc @@ -1,4 +1,4 @@ -#include "cli/service/policy_evaluator.h" +#include "cli/service/planning/policy_evaluator.h" #include #include @@ -6,7 +6,7 @@ #include "absl/strings/numbers.h" #include "absl/strings/str_format.h" #include "absl/strings/str_split.h" -#include "cli/service/proposal_registry.h" +#include "cli/service/planning/proposal_registry.h" namespace yaze { namespace cli { diff --git a/src/cli/service/policy_evaluator.h b/src/cli/service/planning/policy_evaluator.h similarity index 100% rename from src/cli/service/policy_evaluator.h rename to src/cli/service/planning/policy_evaluator.h diff --git a/src/cli/service/proposal_registry.cc b/src/cli/service/planning/proposal_registry.cc similarity index 99% rename from src/cli/service/proposal_registry.cc rename to src/cli/service/planning/proposal_registry.cc index ae6cd01a..26df5476 100644 --- a/src/cli/service/proposal_registry.cc +++ b/src/cli/service/planning/proposal_registry.cc @@ -1,4 +1,4 @@ -#include "cli/service/proposal_registry.h" +#include "cli/service/planning/proposal_registry.h" #include #include diff --git a/src/cli/service/proposal_registry.h b/src/cli/service/planning/proposal_registry.h similarity index 100% rename from src/cli/service/proposal_registry.h rename to src/cli/service/planning/proposal_registry.h diff --git a/src/cli/service/tile16_proposal_generator.cc b/src/cli/service/planning/tile16_proposal_generator.cc similarity index 99% rename from src/cli/service/tile16_proposal_generator.cc rename to src/cli/service/planning/tile16_proposal_generator.cc index 3d9ee8ab..fa46539f 100644 --- a/src/cli/service/tile16_proposal_generator.cc +++ b/src/cli/service/planning/tile16_proposal_generator.cc @@ -1,4 +1,4 @@ -#include "cli/service/tile16_proposal_generator.h" +#include "cli/service/planning/tile16_proposal_generator.h" #include #include diff --git a/src/cli/service/tile16_proposal_generator.h b/src/cli/service/planning/tile16_proposal_generator.h similarity index 100% rename from src/cli/service/tile16_proposal_generator.h rename to src/cli/service/planning/tile16_proposal_generator.h diff --git a/src/cli/service/resource_catalog.cc b/src/cli/service/resources/resource_catalog.cc similarity index 99% rename from src/cli/service/resource_catalog.cc rename to src/cli/service/resources/resource_catalog.cc index a8076c36..9567affb 100644 --- a/src/cli/service/resource_catalog.cc +++ b/src/cli/service/resources/resource_catalog.cc @@ -1,4 +1,4 @@ -#include "cli/service/resource_catalog.h" +#include "cli/service/resources/resource_catalog.h" #include diff --git a/src/cli/service/resource_catalog.h b/src/cli/service/resources/resource_catalog.h similarity index 100% rename from src/cli/service/resource_catalog.h rename to src/cli/service/resources/resource_catalog.h diff --git a/src/cli/service/resource_context_builder.cc b/src/cli/service/resources/resource_context_builder.cc similarity index 99% rename from src/cli/service/resource_context_builder.cc rename to src/cli/service/resources/resource_context_builder.cc index 866b38b6..7072f348 100644 --- a/src/cli/service/resource_context_builder.cc +++ b/src/cli/service/resources/resource_context_builder.cc @@ -1,4 +1,4 @@ -#include "cli/service/resource_context_builder.h" +#include "cli/service/resources/resource_context_builder.h" #include diff --git a/src/cli/service/resource_context_builder.h b/src/cli/service/resources/resource_context_builder.h similarity index 100% rename from src/cli/service/resource_context_builder.h rename to src/cli/service/resources/resource_context_builder.h diff --git a/src/cli/service/rom_sandbox_manager.cc b/src/cli/service/rom/rom_sandbox_manager.cc similarity index 99% rename from src/cli/service/rom_sandbox_manager.cc rename to src/cli/service/rom/rom_sandbox_manager.cc index c82d2961..b1169552 100644 --- a/src/cli/service/rom_sandbox_manager.cc +++ b/src/cli/service/rom/rom_sandbox_manager.cc @@ -1,4 +1,4 @@ -#include "cli/service/rom_sandbox_manager.h" +#include "cli/service/rom/rom_sandbox_manager.h" #include #include diff --git a/src/cli/service/rom_sandbox_manager.h b/src/cli/service/rom/rom_sandbox_manager.h similarity index 100% rename from src/cli/service/rom_sandbox_manager.h rename to src/cli/service/rom/rom_sandbox_manager.h diff --git a/src/cli/service/test_suite.h b/src/cli/service/testing/test_suite.h similarity index 97% rename from src/cli/service/test_suite.h rename to src/cli/service/testing/test_suite.h index 6d71efdb..b093b0ac 100644 --- a/src/cli/service/test_suite.h +++ b/src/cli/service/testing/test_suite.h @@ -7,7 +7,7 @@ #include "absl/strings/string_view.h" #include "absl/time/time.h" -#include "cli/service/gui_automation_client.h" +#include "cli/service/gui/gui_automation_client.h" namespace yaze { namespace cli { diff --git a/src/cli/service/test_suite_loader.cc b/src/cli/service/testing/test_suite_loader.cc similarity index 99% rename from src/cli/service/test_suite_loader.cc rename to src/cli/service/testing/test_suite_loader.cc index 92e7f01d..caccc619 100644 --- a/src/cli/service/test_suite_loader.cc +++ b/src/cli/service/testing/test_suite_loader.cc @@ -1,4 +1,4 @@ -#include "cli/service/test_suite_loader.h" +#include "cli/service/testing/test_suite_loader.h" #include #include diff --git a/src/cli/service/test_suite_loader.h b/src/cli/service/testing/test_suite_loader.h similarity index 91% rename from src/cli/service/test_suite_loader.h rename to src/cli/service/testing/test_suite_loader.h index ca64d974..7e47ff67 100644 --- a/src/cli/service/test_suite_loader.h +++ b/src/cli/service/testing/test_suite_loader.h @@ -5,7 +5,7 @@ #include "absl/status/statusor.h" #include "absl/strings/string_view.h" -#include "cli/service/test_suite.h" +#include "cli/service/testing/test_suite.h" namespace yaze { namespace cli { diff --git a/src/cli/service/test_suite_reporter.cc b/src/cli/service/testing/test_suite_reporter.cc similarity index 99% rename from src/cli/service/test_suite_reporter.cc rename to src/cli/service/testing/test_suite_reporter.cc index c99e3ad2..85d4b0a1 100644 --- a/src/cli/service/test_suite_reporter.cc +++ b/src/cli/service/testing/test_suite_reporter.cc @@ -1,4 +1,4 @@ -#include "cli/service/test_suite_reporter.h" +#include "cli/service/testing/test_suite_reporter.h" #include #include diff --git a/src/cli/service/test_suite_reporter.h b/src/cli/service/testing/test_suite_reporter.h similarity index 92% rename from src/cli/service/test_suite_reporter.h rename to src/cli/service/testing/test_suite_reporter.h index 3dfe52d9..f5d88b47 100644 --- a/src/cli/service/test_suite_reporter.h +++ b/src/cli/service/testing/test_suite_reporter.h @@ -4,7 +4,7 @@ #include #include "absl/status/statusor.h" -#include "cli/service/test_suite.h" +#include "cli/service/testing/test_suite.h" namespace yaze { namespace cli { diff --git a/src/cli/service/test_suite_writer.cc b/src/cli/service/testing/test_suite_writer.cc similarity index 99% rename from src/cli/service/test_suite_writer.cc rename to src/cli/service/testing/test_suite_writer.cc index 402ebb23..105b4ade 100644 --- a/src/cli/service/test_suite_writer.cc +++ b/src/cli/service/testing/test_suite_writer.cc @@ -1,4 +1,4 @@ -#include "cli/service/test_suite_writer.h" +#include "cli/service/testing/test_suite_writer.h" #include #include diff --git a/src/cli/service/test_suite_writer.h b/src/cli/service/testing/test_suite_writer.h similarity index 94% rename from src/cli/service/test_suite_writer.h rename to src/cli/service/testing/test_suite_writer.h index a892da59..7466a148 100644 --- a/src/cli/service/test_suite_writer.h +++ b/src/cli/service/testing/test_suite_writer.h @@ -4,7 +4,7 @@ #include #include "absl/status/status.h" -#include "cli/service/test_suite.h" +#include "cli/service/testing/test_suite.h" namespace yaze { namespace cli { diff --git a/src/cli/service/test_workflow_generator.cc b/src/cli/service/testing/test_workflow_generator.cc similarity index 99% rename from src/cli/service/test_workflow_generator.cc rename to src/cli/service/testing/test_workflow_generator.cc index 62ce0f6c..59632adf 100644 --- a/src/cli/service/test_workflow_generator.cc +++ b/src/cli/service/testing/test_workflow_generator.cc @@ -1,7 +1,7 @@ // test_workflow_generator.cc // Implementation of natural language to test workflow conversion -#include "cli/service/test_workflow_generator.h" +#include "cli/service/testing/test_workflow_generator.h" #include "absl/strings/ascii.h" #include "absl/strings/match.h" diff --git a/src/cli/service/test_workflow_generator.h b/src/cli/service/testing/test_workflow_generator.h similarity index 100% rename from src/cli/service/test_workflow_generator.h rename to src/cli/service/testing/test_workflow_generator.h diff --git a/src/cli/z3ed.cmake b/src/cli/z3ed.cmake index 7218d5ed..eadf5da1 100644 --- a/src/cli/z3ed.cmake +++ b/src/cli/z3ed.cmake @@ -47,25 +47,25 @@ add_executable( cli/handlers/agent/test_common.cc cli/handlers/agent/test_commands.cc cli/handlers/agent/gui_commands.cc - cli/service/ai_service.cc - cli/service/ollama_ai_service.cc - cli/service/prompt_builder.cc - cli/service/proposal_registry.cc - cli/service/resource_catalog.cc - cli/service/rom_sandbox_manager.cc - cli/service/policy_evaluator.cc - cli/service/test_suite.h - cli/service/test_suite_loader.cc - cli/service/test_suite_loader.h - cli/service/test_suite_reporter.cc - cli/service/test_suite_reporter.h - cli/service/test_suite_writer.cc - cli/service/test_suite_writer.h - cli/service/gemini_ai_service.cc - cli/service/tile16_proposal_generator.h - cli/service/tile16_proposal_generator.cc - cli/service/resource_context_builder.h - cli/service/resource_context_builder.cc + cli/service/ai/ai_service.cc + cli/service/ai/ollama_ai_service.cc + cli/service/ai/prompt_builder.cc + cli/service/planning/proposal_registry.cc + cli/service/resources/resource_catalog.cc + cli/service/rom/rom_sandbox_manager.cc + cli/service/planning/policy_evaluator.cc + cli/service/testing/test_suite.h + cli/service/testing/test_suite_loader.cc + cli/service/testing/test_suite_loader.h + cli/service/testing/test_suite_reporter.cc + cli/service/testing/test_suite_reporter.h + cli/service/testing/test_suite_writer.cc + cli/service/testing/test_suite_writer.h + cli/service/ai/gemini_ai_service.cc + cli/service/planning/tile16_proposal_generator.h + cli/service/planning/tile16_proposal_generator.cc + cli/service/resources/resource_context_builder.h + cli/service/resources/resource_context_builder.cc app/rom.cc app/core/project.cc app/core/asar_wrapper.cc @@ -83,8 +83,8 @@ if(YAZE_WITH_JSON) add_subdirectory(${CMAKE_SOURCE_DIR}/third_party/json ${CMAKE_BINARY_DIR}/third_party/json) target_compile_definitions(z3ed PRIVATE YAZE_WITH_JSON) target_link_libraries(z3ed PRIVATE nlohmann_json::nlohmann_json) - list(APPEND Z3ED_SRC_FILES cli/service/gemini_ai_service.cc) - list(APPEND Z3ED_SRC_FILES cli/service/prompt_builder.cc) + list(APPEND Z3ED_SRC_FILES cli/service/ai/gemini_ai_service.cc) + list(APPEND Z3ED_SRC_FILES cli/service/ai/prompt_builder.cc) endif() # ============================================================================ @@ -162,10 +162,10 @@ if(YAZE_WITH_GRPC) # Add CLI gRPC service sources target_sources(z3ed PRIVATE - ${CMAKE_SOURCE_DIR}/src/cli/service/gui_automation_client.cc - ${CMAKE_SOURCE_DIR}/src/cli/service/gui_automation_client.h - ${CMAKE_SOURCE_DIR}/src/cli/service/test_workflow_generator.cc - ${CMAKE_SOURCE_DIR}/src/cli/service/test_workflow_generator.h) + ${CMAKE_SOURCE_DIR}/src/cli/service/gui/gui_automation_client.cc + ${CMAKE_SOURCE_DIR}/src/cli/service/gui/gui_automation_client.h + ${CMAKE_SOURCE_DIR}/src/cli/service/testing/test_workflow_generator.cc + ${CMAKE_SOURCE_DIR}/src/cli/service/testing/test_workflow_generator.h) # Link gRPC libraries target_link_libraries(z3ed PRIVATE diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 46d3a161..cfe46cf5 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -44,7 +44,7 @@ if(YAZE_BUILD_TESTS AND NOT YAZE_BUILD_TESTS STREQUAL "OFF") unit/zelda3/dungeon_component_unit_test.cc # CLI Services (for catalog serialization tests) - ../src/cli/service/resource_catalog.cc + ../src/cli/service/resources/resource_catalog.cc # Integration Tests integration/asar_integration_test.cc @@ -98,7 +98,7 @@ if(YAZE_BUILD_TESTS AND NOT YAZE_BUILD_TESTS STREQUAL "OFF") unit/zelda3/dungeon_component_unit_test.cc # CLI Services (for catalog serialization tests) - ../src/cli/service/resource_catalog.cc + ../src/cli/service/resources/resource_catalog.cc # Integration Tests integration/asar_integration_test.cc diff --git a/test/unit/cli/resource_catalog_test.cc b/test/unit/cli/resource_catalog_test.cc index 6a1f8c1b..9861f563 100644 --- a/test/unit/cli/resource_catalog_test.cc +++ b/test/unit/cli/resource_catalog_test.cc @@ -1,4 +1,4 @@ -#include "cli/service/resource_catalog.h" +#include "cli/service/resources/resource_catalog.h" #include #include