feat(ui): Enhanced context control with per-file flags and Gemini cache awareness

This commit is contained in:
2026-03-07 12:13:08 -05:00
parent 61f331aee6
commit d7a6ba7e51
10 changed files with 383 additions and 28 deletions

View File

@@ -126,7 +126,7 @@ def default_project(name: str = "unnamed") -> dict[str, Any]:
}
},
"discussion": {
"roles": ["User", "AI", "Vendor API", "System", "Reasoning"],
"roles": ["User", "AI", "Vendor API", "System", "Reasoning", "Context"],
"active": "main",
"discussions": {"main": default_discussion()},
},
@@ -150,6 +150,10 @@ def load_project(path: Union[str, Path]) -> dict[str, Any]:
"""
with open(path, "rb") as f:
proj = tomllib.load(f)
# Deserialise FileItems in files.paths
if "files" in proj and "paths" in proj["files"]:
from src import models
proj["files"]["paths"] = [models.FileItem.from_dict(p) if isinstance(p, dict) else p for p in proj["files"]["paths"]]
hist_path = get_history_path(path)
if "discussion" in proj:
disc = proj.pop("discussion")
@@ -184,6 +188,9 @@ def save_project(proj: dict[str, Any], path: Union[str, Path], disc_data: Option
If 'discussion' is present in proj, it is moved to the sibling history file.
"""
proj = clean_nones(proj)
# Serialise FileItems
if "files" in proj and "paths" in proj["files"]:
proj["files"]["paths"] = [p.to_dict() if hasattr(p, "to_dict") else p for p in proj["files"]["paths"]]
if "discussion" in proj:
if disc_data is None:
disc_data = proj["discussion"]
@@ -206,7 +213,7 @@ def migrate_from_legacy_config(cfg: dict[str, Any]) -> dict[str, Any]:
if key in cfg:
proj[key] = dict(cfg[key])
disc = cfg.get("discussion", {})
proj["discussion"]["roles"] = disc.get("roles", ["User", "AI", "Vendor API", "System"])
proj["discussion"]["roles"] = disc.get("roles", ["User", "AI", "Vendor API", "System", "Context"])
main_disc = proj["discussion"]["discussions"]["main"]
main_disc["history"] = disc.get("history", [])
main_disc["last_updated"] = now_ts()