Skip to content

⚡️ Speed up function sanitize_data by 239% in PR #10820 (cz/add-logs-feature)#11190

Closed
codeflash-ai[bot] wants to merge 24 commits into
mainfrom
codeflash/optimize-pr10820-2026-01-05T13.41.01
Closed

⚡️ Speed up function sanitize_data by 239% in PR #10820 (cz/add-logs-feature)#11190
codeflash-ai[bot] wants to merge 24 commits into
mainfrom
codeflash/optimize-pr10820-2026-01-05T13.41.01

Conversation

@codeflash-ai
Copy link
Copy Markdown
Contributor

@codeflash-ai codeflash-ai Bot commented Jan 5, 2026

⚡️ This pull request contains optimizations for PR #10820

If you approve this dependent PR, these changes will be merged into the original PR branch cz/add-logs-feature.

This PR will be automatically closed if the original PR is merged.


📄 239% (2.39x) speedup for sanitize_data in src/backend/base/langflow/services/database/models/transactions/model.py

⏱️ Runtime : 5.73 milliseconds 1.69 milliseconds (best of 66 runs)

📝 Explanation and details

The optimized code achieves a 239% speedup (from 5.73ms to 1.69ms) by introducing memoization via @cache decorator for the _is_sensitive_key function.

Key Optimization

The core change wraps _is_sensitive_key in a cached function _is_sensitive_key_cached:

@cache
def _is_sensitive_key_cached(key: str) -> bool:
    return _is_sensitive_key(key)

Why This Works

Looking at the line profiler results, the original code spent 47.4% of total time (12.22ms out of 25.76ms) calling _is_sensitive_key(key) on line that checks sensitivity. In the optimized version, this drops to 34.8% (7.52ms out of 21.57ms) - a reduction of ~4.7ms despite being called the same number of times (4,400 hits).

The reason: _is_sensitive_key performs expensive operations on every call:

  1. String lowercasing: key.lower()
  2. Set membership check: key_lower in SENSITIVE_KEY_NAMES
  3. Regex matching: SENSITIVE_KEYS_PATTERN.match(key_lower)

When sanitizing nested data structures, the same keys appear repeatedly across different dictionaries (e.g., "api_key", "password", "username"). Without caching, each occurrence re-executes all three operations. With @cache, after the first check, subsequent lookups for the same key are O(1) dictionary lookups returning the cached boolean result.

Test Case Performance

The optimization particularly excels in test cases with:

  • Repeated key names: test_large_flat_dict_many_sensitive_keys (500 dicts with same key pattern)
  • Nested structures with common keys: test_large_nested_structure (100 users each with "username" and "token")
  • Batch processing: test_large_list_of_dicts_with_sensitive_keys (300 dicts with identical "api_key")

For workloads with unique keys every time, the cache provides minimal benefit, but the overhead is negligible (just a hash table lookup miss).

Impact Considerations

Since function_references is unavailable, we can't definitively assess hot path placement. However, given that this is a sanitize_data function in a database transactions model, it's likely called:

  • Before logging/auditing database operations
  • In API response sanitization
  • During error reporting

If called in loops or high-frequency endpoints, the 239% speedup compounds significantly. The optimization is safe because:

  1. _is_sensitive_key is a pure function (deterministic based on input)
  2. Cache memory growth is bounded by the number of unique keys in the codebase (typically dozens, not millions)
  3. No behavioral changes - same output guaranteed

Correctness verification report:

Test Status
⚙️ Existing Unit Tests 27 Passed
🌀 Generated Regression Tests 117 Passed
⏪ Replay Tests 🔘 None Found
🔎 Concolic Coverage Tests 🔘 None Found
📊 Tests Coverage 100.0%
⚙️ Click to see Existing Unit Tests
🌀 Click to see Generated Regression Tests
import pytest
from langflow.services.database.models.transactions.model import sanitize_data

# function to test
# (Paste the sanitize_data implementation here; omitted for brevity in this cell.)

# -------------------------
# Basic Test Cases
# -------------------------

def test_none_input_returns_none():
    # Should return None if input is None
    codeflash_output = sanitize_data(None)

def test_non_dict_input_returns_input():
    # Should return the input unchanged if it's not a dict
    codeflash_output = sanitize_data("not a dict")
    codeflash_output = sanitize_data(123)
    codeflash_output = sanitize_data([1, 2, 3])

def test_no_sensitive_keys_returns_same_dict():
    # Dict with no sensitive keys should be unchanged
    data = {"username": "user", "email": "test@example.com"}
    codeflash_output = sanitize_data(data)

def test_simple_sensitive_key_masked():
    # Sensitive key should be masked
    data = {"api_key": "1234567890abcdef"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_short_value_fully_redacted():
    # Sensitive key with short value should be fully redacted
    data = {"token": "short"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_empty_string_redacted():
    # Sensitive key with empty string should be redacted
    data = {"password": ""}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_non_string_redacted():
    # Sensitive key with non-string value should be redacted
    data = {"secret": 12345}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_excluded_key_removed():
    # Key in EXCLUDED_KEYS should not appear in output
    data = {"code": "print('hello')", "username": "bob"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

# -------------------------
# Edge Test Cases
# -------------------------

def test_case_insensitive_key_matching():
    # Keys should be matched case-insensitively
    data = {"API_KEY": "abcdefgh12345678"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_pattern_matching_on_suffix():
    # Suffix pattern matching should mask keys like "my_private-key"
    data = {"my_private-key": "A1B2C3D4E5F6G7H8"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_in_nested_dict():
    # Sensitive keys inside nested dicts should be masked
    data = {
        "outer": {
            "auth_token": "abcdefgh12345678"
        }
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_in_list_of_dicts():
    # Sensitive keys inside dicts within a list should be masked
    data = {
        "users": [
            {"username": "alice", "password": "supersecretpassword"},
            {"username": "bob", "password": "short"}
        ]
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_list_of_lists_and_dicts():
    # Handles lists of lists and dicts recursively
    data = {
        "records": [
            [
                {"token": "abcdefg1234567"},
                {"not_sensitive": 42}
            ],
            [
                {"password": "mypasswordislong"},
                {"password": "short"}
            ]
        ]
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_multiple_sensitive_and_excluded_keys():
    data = {
        "api_key": "A" * 20,
        "code": "should be excluded",
        "nested": {
            "password": "B" * 13,
            "code": "also excluded"
        }
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_with_none_value():
    data = {"secret": None}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_with_false_value():
    data = {"token": False}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_with_empty_list():
    data = {"api_key": []}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_with_empty_dict():
    data = {"password": {}}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_with_unusual_types():
    class Dummy:
        pass
    data = {"secret": Dummy()}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_with_bytes_value():
    data = {"token": b"abcdef1234567890"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_with_tuple_value():
    data = {"api_key": ("tuple",)}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_with_set_value():
    data = {"password": {"set"}}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_dict_with_only_excluded_keys():
    data = {"code": "something"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_with_whitespace_value():
    data = {"token": " " * 20}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_sensitive_key_with_newline_value():
    data = {"api_key": "abcd\nefghijklmnop"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

# -------------------------
# Large Scale Test Cases
# -------------------------

def test_large_flat_dict_many_sensitive_keys():
    # Large dict with many sensitive keys
    data = {f"api_key_{i}": "A" * 16 for i in range(500)}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output
    for i in range(500):
        key = f"api_key_{i}"

def test_large_nested_structure():
    # Large nested structure of dicts and lists
    data = {
        "users": [
            {"username": f"user{i}", "token": f"tok{i:04d}secretvalue"} for i in range(100)
        ],
        "meta": {
            "api_key": "K" * 20,
            "code": "should be excluded"
        }
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output
    for i in range(100):
        masked = sanitized["users"][i]["token"]

def test_large_list_of_dicts_with_mixed_keys():
    # List of dicts, some with sensitive keys, some without
    data = []
    for i in range(500):
        d = {"id": i}
        if i % 3 == 0:
            d["password"] = f"pass{i}secret"
        if i % 5 == 0:
            d["api_key"] = "A" * 16
        data.append(d)
    codeflash_output = sanitize_data({"records": data}); sanitized = codeflash_output
    for i, d in enumerate(sanitized["records"]):
        if "password" in d:
            val = d["password"]
            if len(f"pass{i}secret") > 12:
                pass
            else:
                pass
        if "api_key" in d:
            pass

def test_large_dict_with_excluded_keys():
    # Large dict with only excluded keys
    data = {f"code": "print('x')" for _ in range(100)}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_large_dict_with_mixed_sensitive_and_normal_keys():
    # Large dict with a mix of sensitive and non-sensitive keys
    data = {}
    for i in range(300):
        data[f"api_key_{i}"] = "X" * 20
        data[f"normal_{i}"] = f"value{i}"
    codeflash_output = sanitize_data(data); sanitized = codeflash_output
    for i in range(300):
        pass

# -------------------------
# Mutation-killing tests
# -------------------------

@pytest.mark.parametrize("key", [
    "api_key", "API_KEY", "api-key", "apikey", "password", "passwd", "secret", "token",
    "auth_token", "access_token", "api_token", "bearer_token", "credential", "credentials",
    "auth", "authorization", "bearer", "private_key", "private-key", "access_key", "access-key",
    "openai_api_key", "anthropic_api_key",
    "my_api_key", "user-password", "service_token", "bearer", "private_key", "access_key"
])
def test_all_sensitive_keys_are_masked(key):
    # All known sensitive keys (exact and pattern) are masked
    value = "SensitiveValue123456"
    codeflash_output = sanitize_data({key: value}); sanitized = codeflash_output
    # Should not expose the value directly
    masked = sanitized[key]

@pytest.mark.parametrize("key", [
    "api_key", "API_KEY", "api-key", "apikey", "password", "passwd", "secret", "token",
    "auth_token", "access_token", "api_token", "bearer_token", "credential", "credentials",
    "auth", "authorization", "bearer", "private_key", "private-key", "access_key", "access-key",
    "openai_api_key", "anthropic_api_key",
    "my_api_key", "user-password", "service_token", "bearer", "private_key", "access_key"
])
def test_sensitive_keys_in_nested_structures(key):
    # Sensitive keys are masked even when nested
    data = {"outer": {"inner": {key: "SensitiveValue123456"}}}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output
    masked = sanitized["outer"]["inner"][key]
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.
#------------------------------------------------
import pytest
from langflow.services.database.models.transactions.model import sanitize_data

# function to test
# (The sanitize_data function and its helpers are assumed to be defined above, as provided.)

# ------------------------------
# Basic Test Cases
# ------------------------------

def test_basic_no_sensitive_keys():
    # Test with a dict that contains no sensitive keys
    data = {"username": "alice", "email": "alice@example.com", "age": 30}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_basic_sensitive_key_masked():
    # Test with a dict containing a sensitive key with a long value
    data = {"api_key": "1234567890abcdef"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_basic_sensitive_key_short_value():
    # Test with a sensitive key with a short value (<=12 chars)
    data = {"password": "shortpass"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_basic_sensitive_key_empty_value():
    # Test with a sensitive key with an empty string value
    data = {"token": ""}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_basic_sensitive_key_none_value():
    # Test with a sensitive key and None value
    data = {"secret": None}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_basic_mixed_keys():
    # Test with both sensitive and non-sensitive keys
    data = {
        "username": "bob",
        "api_key": "A1B2C3D4E5F6G7H8",
        "email": "bob@example.com",
        "password": "letmeinplease"
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_basic_excluded_key():
    # Test that 'code' key is completely excluded
    data = {"code": "print('hello')", "username": "bob"}
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

# ------------------------------
# Edge Test Cases
# ------------------------------

def test_edge_none_input():
    # Test with None input
    codeflash_output = sanitize_data(None)

def test_edge_non_dict_input():
    # Test with a non-dict input (should return as is)
    for val in [123, "string", [1,2,3], (1,2), True]:
        codeflash_output = sanitize_data(val)

def test_edge_empty_dict():
    # Test with an empty dict
    codeflash_output = sanitize_data({})

def test_edge_case_insensitive_keys():
    # Test that key matching is case-insensitive
    data = {
        "API_KEY": "abcdef1234567890",
        "Password": "supersecret",
        "ToKeN": "tokentoken"
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_edge_sensitive_key_suffixes():
    # Test keys that end with sensitive suffixes
    data = {
        "my_api_key": "abcdef1234567890",
        "user-password": "letmeinplease",
        "service_secret": "topsecretinfo",
        "not_sensitive_key": "value"
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_edge_nested_dict():
    # Test with nested dictionaries containing sensitive keys
    data = {
        "user": {
            "name": "alice",
            "api_key": "abcdef1234567890"
        },
        "token": "tokentoken"
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_edge_nested_list():
    # Test with lists containing dicts with sensitive keys
    data = {
        "users": [
            {"username": "alice", "password": "letmeinplease"},
            {"username": "bob", "token": "tokentoken"}
        ]
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_edge_recursive_lists_and_dicts():
    # Test with deep nesting of lists and dicts
    data = {
        "outer": [
            {"inner": {"api_key": "abcdef1234567890", "value": 42}},
            [{"token": "tokentoken"}]
        ]
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_edge_sensitive_key_with_non_str_value():
    # Test masking of sensitive key with non-string value
    data = {
        "api_key": 12345678,
        "password": ["a", "b", "c"],
        "token": {"nested": "dict"}
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_edge_sensitive_key_with_falsey_values():
    # Test sensitive keys with falsey values (0, False, empty list/dict)
    data = {
        "api_key": 0,
        "password": False,
        "token": [],
        "secret": {}
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

def test_edge_excluded_key_nested():
    # Test that excluded key is removed even when nested
    data = {
        "level1": {
            "code": "print('hi')",
            "x": 1
        },
        "code": "top"
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output

# ------------------------------
# Large Scale Test Cases
# ------------------------------

def test_large_flat_dict():
    # Test a large flat dict with a mix of sensitive and non-sensitive keys
    data = {}
    for i in range(500):
        data[f"user_{i}"] = f"name_{i}"
        data[f"api_key_{i}"] = f"KEY{i:04d}SECRET{i:04d}END"
    codeflash_output = sanitize_data(data); sanitized = codeflash_output
    for i in range(500):
        # Should be masked
        val = sanitized[f"api_key_{i}"]

def test_large_nested_dict():
    # Test a large nested dict structure
    data = {
        "users": [
            {"username": f"user{i}", "password": f"pass{i:04d}longsecret"} for i in range(200)
        ],
        "tokens": [f"TOKEN{i:04d}SECRET{i:04d}" for i in range(200)]
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output
    for i in range(200):
        pass

def test_large_dict_with_excluded_keys():
    # Test that excluded keys are removed from a large dict
    data = {f"code": f"print({i})" for i in range(100)}
    data.update({f"username_{i}": f"name_{i}" for i in range(100)})
    codeflash_output = sanitize_data(data); sanitized = codeflash_output
    for i in range(100):
        pass

def test_large_list_of_dicts_with_sensitive_keys():
    # Test a large list of dicts, each with a sensitive key
    data = [{"api_key": f"KEY{i:04d}SECRET{i:04d}END"} for i in range(300)]
    codeflash_output = sanitize_data({"batch": data}); sanitized = codeflash_output
    for i in range(300):
        val = sanitized["batch"][i]["api_key"]

def test_large_mixed_types():
    # Test a large structure with mixed types, including sensitive keys, lists, dicts, and primitives
    data = {
        "users": [
            {
                "username": f"user{i}",
                "api_key": f"KEY{i:04d}SECRET{i:04d}END",
                "profile": {
                    "password": f"pass{i:04d}longsecret",
                    "details": [i, i*2, {"token": f"TOKEN{i:04d}SECRET{i:04d}"}]
                }
            }
            for i in range(50)
        ],
        "meta": {
            "run_id": 123,
            "code": "should be excluded"
        }
    }
    codeflash_output = sanitize_data(data); sanitized = codeflash_output
    for i in range(50):
        user = sanitized["users"][i]
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.

To edit these changes git checkout codeflash/optimize-pr10820-2026-01-05T13.41.01 and push.

Codeflash

Cristhianzl and others added 24 commits December 1, 2025 16:50
# Conflicts:
#	src/lfx/src/lfx/_assets/component_index.json
The optimized code achieves a **239% speedup** (from 5.73ms to 1.69ms) by introducing **memoization** via `@cache` decorator for the `_is_sensitive_key` function.

## Key Optimization

The core change wraps `_is_sensitive_key` in a cached function `_is_sensitive_key_cached`:

```python
@cache
def _is_sensitive_key_cached(key: str) -> bool:
    return _is_sensitive_key(key)
```

## Why This Works

Looking at the line profiler results, the original code spent **47.4% of total time** (12.22ms out of 25.76ms) calling `_is_sensitive_key(key)` on line that checks sensitivity. In the optimized version, this drops to **34.8%** (7.52ms out of 21.57ms) - a reduction of ~4.7ms despite being called the same number of times (4,400 hits).

The reason: `_is_sensitive_key` performs expensive operations on every call:
1. **String lowercasing**: `key.lower()`
2. **Set membership check**: `key_lower in SENSITIVE_KEY_NAMES`
3. **Regex matching**: `SENSITIVE_KEYS_PATTERN.match(key_lower)`

When sanitizing nested data structures, the **same keys appear repeatedly** across different dictionaries (e.g., "api_key", "password", "username"). Without caching, each occurrence re-executes all three operations. With `@cache`, after the first check, subsequent lookups for the same key are O(1) dictionary lookups returning the cached boolean result.

## Test Case Performance

The optimization particularly excels in test cases with:
- **Repeated key names**: `test_large_flat_dict_many_sensitive_keys` (500 dicts with same key pattern)
- **Nested structures with common keys**: `test_large_nested_structure` (100 users each with "username" and "token")
- **Batch processing**: `test_large_list_of_dicts_with_sensitive_keys` (300 dicts with identical "api_key")

For workloads with unique keys every time, the cache provides minimal benefit, but the overhead is negligible (just a hash table lookup miss).

## Impact Considerations

Since `function_references` is unavailable, we can't definitively assess hot path placement. However, given that this is a `sanitize_data` function in a database transactions model, it's likely called:
- Before logging/auditing database operations
- In API response sanitization
- During error reporting

If called in loops or high-frequency endpoints, the 239% speedup compounds significantly. The optimization is **safe** because:
1. `_is_sensitive_key` is a pure function (deterministic based on input)
2. Cache memory growth is bounded by the number of unique keys in the codebase (typically dozens, not millions)
3. No behavioral changes - same output guaranteed
@codeflash-ai codeflash-ai Bot added the ⚡️ codeflash Optimization PR opened by Codeflash AI label Jan 5, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 5, 2026

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions Bot added the community Pull Request from an external contributor label Jan 5, 2026
@codecov
Copy link
Copy Markdown

codecov Bot commented Jan 5, 2026

Codecov Report

❌ Patch coverage is 62.21198% with 82 lines in your changes missing coverage. Please review.
✅ Project coverage is 33.36%. Comparing base (cfdf2f0) to head (b01a6b1).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
src/frontend/src/modals/flowLogsModal/index.tsx 0.00% 25 Missing ⚠️
...rc/modals/flowLogsModal/config/flowLogsColumns.tsx 0.00% 21 Missing ⚠️
...odals/flowLogsModal/components/LogDetailViewer.tsx 0.00% 14 Missing ⚠️
...low/services/database/models/transactions/model.py 90.54% 7 Missing ⚠️
src/lfx/src/lfx/graph/utils.py 30.00% 5 Missing and 2 partials ⚠️
src/lfx/src/lfx/graph/vertex/base.py 57.14% 4 Missing and 2 partials ⚠️
src/lfx/src/lfx/services/transaction/service.py 77.77% 2 Missing ⚠️

❌ Your project status has failed because the head coverage (39.50%) is below the target coverage (60.00%). You can increase the head coverage or adjust the target coverage.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main   #11190      +/-   ##
==========================================
+ Coverage   33.23%   33.36%   +0.12%     
==========================================
  Files        1394     1399       +5     
  Lines       66070    66232     +162     
  Branches     9778     9785       +7     
==========================================
+ Hits        21960    22098     +138     
- Misses      42983    43009      +26     
+ Partials     1127     1125       -2     
Flag Coverage Δ
backend 52.87% <94.01%> (+0.41%) ⬆️
lfx 39.50% <62.50%> (+0.02%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/backend/base/langflow/api/v1/monitor.py 50.00% <100.00%> (ø)
...flow/services/database/models/transactions/crud.py 78.78% <100.00%> (+40.85%) ⬆️
...kend/base/langflow/services/transaction/factory.py 100.00% <100.00%> (ø)
...kend/base/langflow/services/transaction/service.py 100.00% <100.00%> (ø)
src/backend/base/langflow/services/utils.py 81.09% <100.00%> (-0.39%) ⬇️
...s/API/queries/transactions/use-get-transactions.ts 0.00% <ø> (ø)
src/lfx/src/lfx/graph/vertex/vertex_types.py 43.38% <ø> (-0.30%) ⬇️
src/lfx/src/lfx/services/deps.py 59.49% <100.00%> (-3.67%) ⬇️
src/lfx/src/lfx/services/interfaces.py 100.00% <100.00%> (ø)
src/lfx/src/lfx/services/schema.py 100.00% <100.00%> (ø)
... and 7 more

... and 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@codeflash-ai codeflash-ai Bot closed this Jan 5, 2026
Base automatically changed from cz/add-logs-feature to main January 5, 2026 17:44
@codeflash-ai
Copy link
Copy Markdown
Contributor Author

codeflash-ai Bot commented Jan 5, 2026

This PR has been automatically closed because the original PR #10820 by Cristhianzl was closed.

@codeflash-ai codeflash-ai Bot deleted the codeflash/optimize-pr10820-2026-01-05T13.41.01 branch January 5, 2026 17:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⚡️ codeflash Optimization PR opened by Codeflash AI community Pull Request from an external contributor

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants