2#include "absl/time/clock.h"
4#if defined(YAZE_BUILD_AGENT_UI)
22 ProposalDrawer* proposal_drawer,
23 RightPanelManager* right_panel_manager,
24 PanelManager* panel_manager,
25 UserSettings* user_settings) {
26 toast_manager_ = toast_manager;
27 right_panel_manager_ = right_panel_manager;
28 panel_manager_ = panel_manager;
29 user_settings_ = user_settings;
32 session_manager_.CreateSession(
"Agent 1");
36 panel_manager->RegisterEditorPanel(std::make_unique<OracleRamPanel>());
41 EditorDependencies deps;
42 deps.panel_manager = panel_manager;
43 deps.toast_manager = toast_manager;
44 deps.user_settings = user_settings_;
45 agent_editor_.SetDependencies(deps);
49 agent_editor_.Initialize();
50 agent_editor_.InitializeWithDependencies(toast_manager, proposal_drawer,
52 agent_editor_.SetContext(&agent_ui_context_);
55 if (right_panel_manager_) {
56 right_panel_manager_->SetAgentChat(agent_editor_.GetAgentChat());
57 right_panel_manager_->SetProposalDrawer(proposal_drawer);
58 right_panel_manager_->SetToastManager(toast_manager);
63 InitializeKnowledge();
66 agent_editor_.SetKnowledgePanelCallback([
this, toast_manager]() {
67 AgentKnowledgePanel::Callbacks callbacks;
68 callbacks.set_preference = [
this](
const std::string&
key,
69 const std::string& value) {
70 if (knowledge_initialized_) {
71 learned_knowledge_.SetPreference(key, value);
72 learned_knowledge_.SaveAll();
73 SyncKnowledgeToContext();
76 callbacks.remove_preference = [
this](
const std::string&
key) {
77 if (knowledge_initialized_) {
78 learned_knowledge_.RemovePreference(key);
79 learned_knowledge_.SaveAll();
80 SyncKnowledgeToContext();
83 callbacks.clear_all_knowledge = [
this]() {
84 if (knowledge_initialized_) {
85 learned_knowledge_.ClearAll();
86 SyncKnowledgeToContext();
89 callbacks.export_knowledge = [
this, toast_manager]() {
90 if (knowledge_initialized_) {
91 auto json_or = learned_knowledge_.ExportToJSON();
100 callbacks.refresh_knowledge = [
this]() {
101 SyncKnowledgeToContext();
104 knowledge_panel_.Draw(
GetContext(), GetKnowledgeService(), callbacks,
110 SyncStateFromEditor();
114 if (!user_settings_) {
117 agent_editor_.ApplyUserSettingsDefaults(force);
121 agent_editor_.SetRomContext(rom);
122 agent_ui_context_.SetRom(rom);
126 agent_ui_context_.SetProject(project);
129 if (AgentSession* session = session_manager_.GetActiveSession()) {
130 session->context.SetProject(project);
135 agent_ui_context_.SetAsarWrapper(asar_wrapper);
138 if (AgentSession* session = session_manager_.GetActiveSession()) {
139 session->context.SetAsarWrapper(asar_wrapper);
145 auto status = agent_editor_.Update();
150void AgentUiController::SyncStateFromEditor() {
152 const auto& profile = agent_editor_.GetCurrentProfile();
153 auto& ctx_config = agent_ui_context_.agent_config();
156 bool changed =
false;
157 if (ctx_config.ai_provider != profile.provider)
159 if (ctx_config.ai_model != profile.model)
161 if (ctx_config.ollama_host != profile.ollama_host)
163 if (ctx_config.gemini_api_key != profile.gemini_api_key)
165 if (ctx_config.anthropic_api_key != profile.anthropic_api_key)
167 if (ctx_config.openai_api_key != profile.openai_api_key)
169 if (ctx_config.openai_base_url != profile.openai_base_url)
171 if (ctx_config.host_id != profile.host_id)
176 ctx_config.ai_provider = profile.provider;
177 ctx_config.ai_model = profile.model;
178 ctx_config.ollama_host = profile.ollama_host;
179 ctx_config.gemini_api_key = profile.gemini_api_key;
180 ctx_config.anthropic_api_key = profile.anthropic_api_key;
181 ctx_config.openai_api_key = profile.openai_api_key;
182 ctx_config.openai_base_url = profile.openai_base_url;
183 ctx_config.host_id = profile.host_id;
186 last_synced_config_ = ctx_config;
188 SyncStateToComponents();
192void AgentUiController::SyncStateToComponents() {
195 if (
auto* chat = agent_editor_.GetAgentChat()) {
196 chat->SetContext(&agent_ui_context_);
201 agent_editor_.set_active(
true);
205 agent_editor_.set_active(
true);
207 if (panel_manager_) {
208 const size_t session_id = panel_manager_->GetActiveSessionId();
209 panel_manager_->ShowPanel(session_id,
"agent.chat");
210 panel_manager_->MarkPanelRecentlyUsed(
"agent.chat");
213 if (right_panel_manager_) {
217 if (
auto* chat = agent_editor_.GetAgentChat()) {
218 chat->set_active(
true);
219 chat->ScrollToBottom();
232 return &agent_editor_;
237 if (AgentSession* session = session_manager_.GetActiveSession()) {
238 return &session->context;
241 return &agent_ui_context_;
246 if (
const AgentSession* session = session_manager_.GetActiveSession()) {
247 return &session->context;
250 return &agent_ui_context_;
254cli::agent::LearnedKnowledgeService* AgentUiController::GetKnowledgeService() {
255 if (!knowledge_initialized_) {
258 return &learned_knowledge_;
261bool AgentUiController::IsKnowledgeServiceAvailable()
const {
262 return knowledge_initialized_;
265void AgentUiController::InitializeKnowledge() {
266 if (knowledge_initialized_) {
270 auto status = learned_knowledge_.Initialize();
272 knowledge_initialized_ =
true;
273 SyncKnowledgeToContext();
275 "LearnedKnowledgeService initialized successfully");
278 "Failed to initialize LearnedKnowledgeService: %s",
279 status.message().data());
283void AgentUiController::SyncKnowledgeToContext() {
284 if (!knowledge_initialized_) {
289 auto stats = learned_knowledge_.GetStats();
290 auto& knowledge_state = agent_ui_context_.knowledge_state();
292 knowledge_state.initialized =
true;
293 knowledge_state.preference_count = stats.preference_count;
294 knowledge_state.pattern_count = stats.pattern_count;
295 knowledge_state.project_count = stats.project_count;
296 knowledge_state.memory_count = stats.memory_count;
297 knowledge_state.last_refresh = absl::Now();
300 if (AgentSession* session = session_manager_.GetActiveSession()) {
301 session->context.knowledge_state() = knowledge_state;
void SetRomContext(Rom *rom)
AgentUIContext * GetContext()
void Initialize(ToastManager *toast_manager, ProposalDrawer *proposal_drawer, RightPanelManager *right_panel_manager, PanelManager *panel_manager, UserSettings *user_settings)
void SetProjectContext(project::YazeProject *project)
void ApplyUserSettingsDefaults(bool force=false)
AgentEditor * GetAgentEditor()
void SetAsarWrapperContext(core::AsarWrapper *asar_wrapper)
#define LOG_ERROR(category, format,...)
#define LOG_INFO(category, format,...)