mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-08-12 15:59:04 +00:00
* fix(sandbox): guard the output-masking regex with a segment boundary `_compiled_mask_patterns` builds the same class of host→virtual matcher as `LocalSandbox._reverse_output_patterns`, but without the segment-boundary lookahead that one carries. The trailing group needs a separator to consume anything, so when the character after a host base is `-`, `.`, `_`, a digit or a letter, the group matches empty and the regex still matches the bare base. `replace_match` then takes its `matched_path == base` branch and rewrites the sibling: with `/mnt/skills` mounted at `.../skills`, output naming a sibling `.../skills-extra/data.txt` is handed to the model as `/mnt/skills-extra/data.txt` — a container path forward resolution explicitly refuses to map back, so reading it raises FileNotFoundError. This is the sibling site of #4035, which fixed the identical bug in `local_sandbox.py`. That PR's scope argument enumerated the prefix matchers in that file and missed this one; `mask_local_paths_in_output` runs on every glob/grep match and on local bash output. The boundary class mirrors `_content_pattern`'s, not `_command_pattern`'s: this runs over arbitrary command output, where a base can legitimately be followed by `,`, `:` or `\`, all of which the shell-oriented class rejects. * test(sandbox): anchor the sibling boundary at the ACP source too The sibling-rejection cases only fed the skills source. `_compiled_mask_patterns` builds every source's matcher in one loop, so the ACP workspace carried the same defect: nothing maps its parent, and `/mnt/acp-workspace-backup/hello.py` is unresolvable in both directions. User-data is the exception and is now pinned as such: `_thread_virtual_to_actual_mappings` also maps the virtual root `/mnt/user-data` to the three dirs' common parent, so a sibling of `outputs` is still inside a mount and has a real virtual path — the output is byte-identical with and without the boundary. That test is green on main; it guards the boundary from being narrowed into one that stops translating a mapped path. Reverting only `boundary` turns the 5 skills + 4 ACP cases red and leaves the 3 user-data cases green.