feat(context): Interactive Text Slice Highlighting with Fuzzy Anchors
This commit is contained in:
+23
-2
@@ -124,6 +124,7 @@ def build_file_items(base_dir: Path, files: list[str | dict[str, Any]]) -> list[
|
||||
ast_signatures = entry_raw.get("ast_signatures", False)
|
||||
ast_definitions = entry_raw.get("ast_definitions", False)
|
||||
ast_mask = entry_raw.get("ast_mask", {})
|
||||
custom_slices = entry_raw.get("custom_slices", [])
|
||||
elif hasattr(entry_raw, "path"):
|
||||
entry = entry_raw.path
|
||||
tier = getattr(entry_raw, "tier", None)
|
||||
@@ -132,6 +133,7 @@ def build_file_items(base_dir: Path, files: list[str | dict[str, Any]]) -> list[
|
||||
ast_signatures = getattr(entry_raw, "ast_signatures", False)
|
||||
ast_definitions = getattr(entry_raw, "ast_definitions", False)
|
||||
ast_mask = getattr(entry_raw, "ast_mask", {})
|
||||
custom_slices = getattr(entry_raw, "custom_slices", [])
|
||||
else:
|
||||
entry = entry_raw
|
||||
tier = None
|
||||
@@ -140,11 +142,12 @@ def build_file_items(base_dir: Path, files: list[str | dict[str, Any]]) -> list[
|
||||
ast_signatures = False
|
||||
ast_definitions = False
|
||||
ast_mask = {}
|
||||
custom_slices = []
|
||||
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, "ast_mask": ast_mask})
|
||||
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, "custom_slices": custom_slices})
|
||||
continue
|
||||
for path in paths:
|
||||
try:
|
||||
@@ -159,7 +162,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, "ast_mask": ast_mask})
|
||||
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, "custom_slices": custom_slices})
|
||||
return items
|
||||
|
||||
|
||||
@@ -284,6 +287,24 @@ def build_tier3_context(file_items: list[dict[str, Any]], screenshot_base_dir: P
|
||||
is_focus = True
|
||||
break
|
||||
original = entry if entry and "*" not in entry else (str(path) if path else (entry or "unknown"))
|
||||
|
||||
slices = item.get('custom_slices', [])
|
||||
if slices and not item.get('error'):
|
||||
from src.fuzzy_anchor import FuzzyAnchor
|
||||
resolved_blocks = []
|
||||
content = item.get('content', '')
|
||||
suffix = path.suffix.lstrip(".") if path and path.suffix else "text"
|
||||
for slc in slices:
|
||||
range_res = FuzzyAnchor.resolve_slice(content, slc)
|
||||
if range_res:
|
||||
s, e = range_res
|
||||
lines = content.splitlines()
|
||||
resolved_blocks.append("\n".join(lines[s-1:e]))
|
||||
if resolved_blocks:
|
||||
combined = "\n\n... [LINES SKIPPED] ...\n\n".join(resolved_blocks)
|
||||
sections.append(f"### `{original}` (Slices)\n\n```{suffix}\n{combined}\n```")
|
||||
continue # Skip full file logic
|
||||
|
||||
if is_focus or tier == 3 or force_full:
|
||||
suffix = path.suffix.lstrip(".") if path and path.suffix else "text"
|
||||
sections.append(f"### `{original}`\n\n```{suffix}\n{content}\n```")
|
||||
|
||||
Reference in New Issue
Block a user