diff --git a/backend/packages/harness/deerflow/uploads/companions.py b/backend/packages/harness/deerflow/uploads/companions.py index 325c3cc977..cbfc783482 100644 --- a/backend/packages/harness/deerflow/uploads/companions.py +++ b/backend/packages/harness/deerflow/uploads/companions.py @@ -87,7 +87,7 @@ def resolve_companion(original: Path) -> Path | None: return None data = json.loads(record.read_text(encoding="utf-8")) name = data["markdown"] - if data["original"] != original.name or not isinstance(name, str) or Path(name).name != name or not name.endswith(".md"): + if data["original"] != original.name or not isinstance(name, str) or Path(name).name != name or Path(name).suffix.lower() != ".md": return None source_stat = original.stat(follow_symlinks=False) # Legacy three-field records cannot establish whether an equal-size diff --git a/backend/tests/test_upload_companions.py b/backend/tests/test_upload_companions.py index 837eb9112a..0c3fa5ca4c 100644 --- a/backend/tests/test_upload_companions.py +++ b/backend/tests/test_upload_companions.py @@ -32,6 +32,21 @@ def test_unchanged_source_keeps_companion_after_read(converted_upload): assert extract_outline_for_file(original)[0] == [{"title": "Original A", "line": 1}] +def test_companion_record_accepts_uppercase_markdown_suffix(tmp_path): + uploads = tmp_path / "thread" / "user-data" / "uploads" + uploads.mkdir(parents=True) + original = uploads / "report.pdf" + markdown = uploads / "report.MD" + original.write_bytes(b"%PDF ORIGINAL A") + markdown.write_text("# Uppercase suffix\n", encoding="utf-8") + + register_companion(original, markdown) + + assert resolve_companion(original) == markdown + assert companion_names(original.parent) == {markdown.name} + assert extract_outline_for_file(original)[0] == [{"title": "Uppercase suffix", "line": 1}] + + def test_same_size_sandbox_rewrite_rejects_stale_outline(converted_upload): original, markdown = converted_upload before = original.stat()