feat(context): Interactive AST Tree Masking with per-symbol toggles
This commit is contained in:
+27
-2
@@ -123,6 +123,7 @@ def build_file_items(base_dir: Path, files: list[str | dict[str, Any]]) -> list[
|
||||
force_full = entry_raw.get("force_full", False)
|
||||
ast_signatures = entry_raw.get("ast_signatures", False)
|
||||
ast_definitions = entry_raw.get("ast_definitions", False)
|
||||
ast_mask = entry_raw.get("ast_mask", {})
|
||||
elif hasattr(entry_raw, "path"):
|
||||
entry = entry_raw.path
|
||||
tier = getattr(entry_raw, "tier", None)
|
||||
@@ -130,6 +131,7 @@ def build_file_items(base_dir: Path, files: list[str | dict[str, Any]]) -> list[
|
||||
force_full = getattr(entry_raw, "force_full", False)
|
||||
ast_signatures = getattr(entry_raw, "ast_signatures", False)
|
||||
ast_definitions = getattr(entry_raw, "ast_definitions", False)
|
||||
ast_mask = getattr(entry_raw, "ast_mask", {})
|
||||
else:
|
||||
entry = entry_raw
|
||||
tier = None
|
||||
@@ -137,11 +139,12 @@ def build_file_items(base_dir: Path, files: list[str | dict[str, Any]]) -> list[
|
||||
force_full = False
|
||||
ast_signatures = False
|
||||
ast_definitions = False
|
||||
ast_mask = {}
|
||||
if not entry or not isinstance(entry, str):
|
||||
continue
|
||||
paths = resolve_paths(base_dir, entry)
|
||||
if not paths:
|
||||
items.append({"path": None, "entry": entry, "content": f"ERROR: no files matched: {entry}", "error": True, "mtime": 0.0, "tier": tier, "auto_aggregate": auto_aggregate, "force_full": force_full, "ast_signatures": ast_signatures, "ast_definitions": ast_definitions})
|
||||
items.append({"path": None, "entry": entry, "content": f"ERROR: no files matched: {entry}", "error": True, "mtime": 0.0, "tier": tier, "auto_aggregate": auto_aggregate, "force_full": force_full, "ast_signatures": ast_signatures, "ast_definitions": ast_definitions, "ast_mask": ast_mask})
|
||||
continue
|
||||
for path in paths:
|
||||
try:
|
||||
@@ -156,7 +159,7 @@ def build_file_items(base_dir: Path, files: list[str | dict[str, Any]]) -> list[
|
||||
content = f"ERROR: {e}"
|
||||
mtime = 0.0
|
||||
error = True
|
||||
items.append({"path": path, "entry": entry, "content": content, "error": error, "mtime": mtime, "tier": tier, "auto_aggregate": auto_aggregate, "force_full": force_full, "ast_signatures": ast_signatures, "ast_definitions": ast_definitions})
|
||||
items.append({"path": path, "entry": entry, "content": content, "error": error, "mtime": mtime, "tier": tier, "auto_aggregate": auto_aggregate, "force_full": force_full, "ast_signatures": ast_signatures, "ast_definitions": ast_definitions, "ast_mask": ast_mask})
|
||||
return items
|
||||
|
||||
|
||||
@@ -272,6 +275,7 @@ def build_tier3_context(file_items: list[dict[str, Any]], screenshot_base_dir: P
|
||||
force_full = item.get("force_full")
|
||||
ast_signatures = item.get("ast_signatures", False)
|
||||
ast_definitions = item.get("ast_definitions", False)
|
||||
ast_mask = item.get("ast_mask", {})
|
||||
content = item.get("content", "")
|
||||
is_focus = entry in focus_set or (name and name in focus_set) or (path_str and path_str in focus_set)
|
||||
if not is_focus and path_str:
|
||||
@@ -284,6 +288,27 @@ def build_tier3_context(file_items: list[dict[str, Any]], screenshot_base_dir: P
|
||||
suffix = path.suffix.lstrip(".") if path and path.suffix else "text"
|
||||
sections.append(f"### `{original}`\n\n```{suffix}\n{content}\n```")
|
||||
elif path:
|
||||
if ast_mask and not item.get("error"):
|
||||
mask_sections = []
|
||||
from src import mcp_client
|
||||
for symbol, mode in ast_mask.items():
|
||||
if mode == "hide":
|
||||
continue
|
||||
res = ""
|
||||
if path.suffix == ".py":
|
||||
res = mcp_client.py_get_definition(str(path), symbol) if mode == "def" else mcp_client.py_get_signature(str(path), symbol)
|
||||
elif path.suffix in [".c", ".h", ".cpp", ".hpp", ".cxx", ".cc"]:
|
||||
is_cpp = any(ext in path.suffix for ext in [".cpp", ".hpp", ".cxx", ".cc"])
|
||||
if mode == "def":
|
||||
res = mcp_client.ts_cpp_get_definition(str(path), symbol) if is_cpp else mcp_client.ts_c_get_definition(str(path), symbol)
|
||||
else:
|
||||
res = mcp_client.ts_cpp_get_signature(str(path), symbol) if is_cpp else mcp_client.ts_c_get_signature(str(path), symbol)
|
||||
if res:
|
||||
mask_sections.append(res)
|
||||
if mask_sections:
|
||||
suffix = path.suffix.lstrip(".") if path.suffix else "text"
|
||||
sections.append(f"### `{original}` (Masked)\n\n```{suffix}\n" + "\n\n".join(mask_sections) + "\n```")
|
||||
continue
|
||||
if path.suffix in ['.c', '.h', '.cpp', '.hpp', '.cxx', '.cc'] and not item.get("error"):
|
||||
from src import mcp_client
|
||||
if ast_definitions:
|
||||
|
||||
Reference in New Issue
Block a user