checkpoint(Saved system prompt presets)

This commit is contained in:
2026-03-09 22:27:40 -04:00
parent d8a4ec121d
commit e2a403a187
11 changed files with 649 additions and 35 deletions

View File

@@ -24,6 +24,7 @@ from src import session_logger
from src import project_manager
from src import performance_monitor
from src import models
from src import presets
from src.file_cache import ASTParser
from src import ai_client
from src import shell_runner
@@ -297,6 +298,13 @@ class AppController:
self._inject_mode: str = "skeleton"
self._inject_preview: str = ""
self._show_inject_modal: bool = False
self.show_preset_manager_modal: bool = False
self._editing_preset_name: str = ""
self._editing_preset_content: str = ""
self._editing_preset_temperature: float = 0.0
self._editing_preset_top_p: float = 0.0
self._editing_preset_max_output_tokens: int = 4096
self._editing_preset_scope: str = "project"
self.diagnostic_log: List[Dict[str, Any]] = []
self._settable_fields: Dict[str, str] = {
'ai_input': 'ui_ai_input',
@@ -322,10 +330,19 @@ class AppController:
'ui_new_track_name': 'ui_new_track_name',
'ui_new_track_desc': 'ui_new_track_desc',
'manual_approve': 'ui_manual_approve',
'inject_file_path': '_inject_file_path',
'inject_mode': '_inject_mode',
'show_inject_modal': '_show_inject_modal',
'bg_shader_enabled': 'bg_shader_enabled'
'global_system_prompt': 'ui_global_system_prompt',
'project_system_prompt': 'ui_project_system_prompt',
'global_preset_name': 'ui_global_preset_name',
'project_preset_name': 'ui_project_preset_name',
'temperature': 'temperature',
'max_tokens': 'max_tokens',
'show_preset_manager_modal': 'show_preset_manager_modal',
'_editing_preset_name': '_editing_preset_name',
'_editing_preset_content': '_editing_preset_content',
'_editing_preset_temperature': '_editing_preset_temperature',
'_editing_preset_top_p': '_editing_preset_top_p',
'_editing_preset_max_output_tokens': '_editing_preset_max_output_tokens',
'_editing_preset_scope': '_editing_preset_scope'
}
self._gettable_fields = dict(self._settable_fields)
self._gettable_fields.update({
@@ -348,7 +365,20 @@ class AppController:
'_inject_mode': '_inject_mode',
'_inject_preview': '_inject_preview',
'_show_inject_modal': '_show_inject_modal',
'bg_shader_enabled': 'bg_shader_enabled'
'bg_shader_enabled': 'bg_shader_enabled',
'global_system_prompt': 'ui_global_system_prompt',
'project_system_prompt': 'ui_project_system_prompt',
'global_preset_name': 'ui_global_preset_name',
'project_preset_name': 'ui_project_preset_name',
'temperature': 'temperature',
'max_tokens': 'max_tokens',
'show_preset_manager_modal': 'show_preset_manager_modal',
'_editing_preset_name': '_editing_preset_name',
'_editing_preset_content': '_editing_preset_content',
'_editing_preset_temperature': '_editing_preset_temperature',
'_editing_preset_top_p': '_editing_preset_top_p',
'_editing_preset_max_output_tokens': '_editing_preset_max_output_tokens',
'_editing_preset_scope': '_editing_preset_scope'
})
self.perf_monitor = performance_monitor.get_monitor()
self._perf_profiling_enabled = False
@@ -423,7 +453,10 @@ class AppController:
}
self._predefined_callbacks: dict[str, Callable[..., Any]] = {
'_test_callback_func_write_to_file': self._test_callback_func_write_to_file,
'_set_env_var': lambda k, v: os.environ.update({k: v})
'_set_env_var': lambda k, v: os.environ.update({k: v}),
'_apply_preset': self._apply_preset,
'_switch_project': self._switch_project,
'_refresh_from_project': self._refresh_from_project
}
def _update_gcli_adapter(self, path: str) -> None:
@@ -787,6 +820,11 @@ class AppController:
self.ui_auto_add_history = disc_sec.get("auto_add", False)
self.ui_global_system_prompt = self.config.get("ai", {}).get("system_prompt", "")
self.preset_manager = presets.PresetManager(Path(self.active_project_path) if self.active_project_path else None)
self.presets = self.preset_manager.load_all()
self.ui_global_preset_name = ai_cfg.get("active_preset")
self.ui_project_preset_name = proj_meta.get("active_preset")
gui_cfg = self.config.get("gui", {})
from src import bg_shader
bg_shader.get_bg().enabled = gui_cfg.get("bg_shader_enabled", False)
@@ -1689,6 +1727,7 @@ class AppController:
self.ui_project_git_dir = proj_meta.get("git_dir", "")
self.ui_project_system_prompt = proj_meta.get("system_prompt", "")
self.ui_project_main_context = proj_meta.get("main_context", "")
self.ui_project_preset_name = proj_meta.get("active_preset")
self.ui_gemini_cli_path = self.project.get("gemini_cli", {}).get("binary_path", "gemini")
self.ui_auto_add_history = proj.get("discussion", {}).get("auto_add", False)
self.ui_auto_scroll_comms = proj.get("project", {}).get("auto_scroll_comms", True)
@@ -1726,6 +1765,30 @@ class AppController:
if track_history:
with self._disc_entries_lock:
self.disc_entries = models.parse_history_entries(track_history, self.disc_roles)
self.preset_manager.project_root = Path(self.ui_files_base_dir)
self.presets = self.preset_manager.load_all()
def _apply_preset(self, name: str, scope: str) -> None:
if name == "None":
if scope == "global":
self.ui_global_preset_name = ""
else:
self.ui_project_preset_name = ""
return
preset = self.presets.get(name)
if not preset:
return
if scope == "global":
self.ui_global_system_prompt = preset.system_prompt
self.ui_global_preset_name = name
else:
self.ui_project_system_prompt = preset.system_prompt
self.ui_project_preset_name = name
if preset.temperature is not None:
self.temperature = preset.temperature
if preset.max_output_tokens is not None:
self.max_tokens = preset.max_output_tokens
def _cb_load_track(self, track_id: str) -> None:
state = project_manager.load_track_state(track_id, self.ui_files_base_dir)
@@ -2053,6 +2116,7 @@ class AppController:
proj["project"]["git_dir"] = self.ui_project_git_dir
proj["project"]["system_prompt"] = self.ui_project_system_prompt
proj["project"]["main_context"] = self.ui_project_main_context
proj["project"]["active_preset"] = self.ui_project_preset_name
proj["project"]["word_wrap"] = self.ui_word_wrap
proj["project"]["summary_only"] = self.ui_summary_only
proj["project"]["auto_scroll_comms"] = self.ui_auto_scroll_comms
@@ -2082,6 +2146,7 @@ class AppController:
"temperature": self.temperature,
"max_tokens": self.max_tokens,
"history_trunc_limit": self.history_trunc_limit,
"active_preset": self.ui_global_preset_name,
}
self.config["ai"]["system_prompt"] = self.ui_global_system_prompt
self.config["projects"] = {"paths": self.project_paths, "active": self.active_project_path}