-
-
Notifications
You must be signed in to change notification settings - Fork 50
feat: Implement network configuration and proxy detection (Issue #25) #340
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. 📝 WalkthroughWalkthroughAdds a NetworkConfig module with proxy/VPN detection, connectivity checks, apt/pip auto-configuration and offline caching; integrates lazy network auto-configuration and a new notify CLI subcommand; introduces a thread-safe SQLiteConnectionPool and applies broad thread-safety fixes across many modules, plus docs and tests. Changes
Sequence Diagram(s)sequenceDiagram
participant CLI as Cortex CLI
participant NC as NetworkConfig
participant ENV as Environment
participant SYS as SystemConfig
participant NET as Network
CLI->>NC: instantiate(auto_detect=True) / auto_configure()
Note right of NC: read force_proxy/offline flags (lazy)
NC->>ENV: read proxy env vars (HTTP/HTTPS/NO_PROXY)
ENV-->>NC: proxy settings / none
NC->>SYS: read GNOME & system proxy files
SYS-->>NC: system proxy settings / none
NC->>NET: probe connectivity (TCP probe → HTTP HEADs)
NET-->>NC: online/offline, latency result
NC->>NET: inspect interfaces/routing
NET-->>NC: VPN indicators (tun/wg/ppp)
NC->>NC: evaluate quality & build client proxy config
alt offline detected
NC->>NC: enable offline_fallback, load cached packages
else proxy present
NC->>SYS: write apt proxy config (may require sudo)
NC->>ENV: set pip/httpx proxy env vars
end
NC-->>CLI: return summary (errors logged, non-fatal)
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 5
🧹 Nitpick comments (5)
cortex/cli.py (2)
106-172: Add type hint for return type.The
notifymethod consistently returnsintexit codes but lacks a return type annotation. Per coding guidelines, type hints are required for Python code.🔎 Proposed fix
- def notify(self, args): + def notify(self, args) -> int: """Handle notification commands"""
879-881: Consider making dnd arguments optional with nargs='?'.The
startandendarguments are defined as required positional arguments, but thenotify()method at lines 144-146 handles missing values with an error message. Making them optional withnargs='?'would provide a cleaner user experience with argparse's built-in help.🔎 Proposed fix
dnd_parser = notify_subs.add_parser("dnd", help="Configure DND window") -dnd_parser.add_argument("start", help="Start time (HH:MM)") -dnd_parser.add_argument("end", help="End time (HH:MM)") +dnd_parser.add_argument("start", nargs="?", help="Start time (HH:MM)") +dnd_parser.add_argument("end", nargs="?", help="End time (HH:MM)")docs/NETWORK_CONFIG.md (3)
25-58: Add language specifier to code block.Per markdownlint MD040, fenced code blocks should have a language specified. For ASCII diagrams, use
textorplaintext.🔎 Proposed fix
-``` +```text ┌─────────────────────────────────────────────────────────────────┐
281-283: Add language specifier to code block.🔎 Proposed fix
-``` +```text ~/.cortex/cache/available_packages.json</details> --- `316-325`: **Add language specifiers to code blocks.** <details> <summary>🔎 Proposed fix for lines 316-318</summary> ```diff -``` +```text /etc/apt/apt.conf.d/90cortex-proxy</details> <details> <summary>🔎 Proposed fix for lines 321-325</summary> ```diff -``` +```ini # Cortex auto-generated proxy configuration Acquire::http::Proxy "http://proxy:8080"; Acquire::https::Proxy "http://proxy:8080";</details> </blockquote></details> </blockquote></details> <details> <summary>📜 Review details</summary> **Configuration used**: defaults **Review profile**: CHILL **Plan**: Pro <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between f6bfa4911528bddd48e6553200e827c97dcb3225 and 3de3b745c541b5e7de1814459f8d08ea1a8b3e84. </details> <details> <summary>📒 Files selected for processing (5)</summary> * `cortex/cli.py` * `cortex/network_config.py` * `docs/NETWORK_CONFIG.md` * `docs/NETWORK_CONFIG_TESTS.md` * `tests/test_network_config.py` </details> <details> <summary>🧰 Additional context used</summary> <details> <summary>📓 Path-based instructions (2)</summary> <details> <summary>**/*.py</summary> **📄 CodeRabbit inference engine (AGENTS.md)** > `**/*.py`: Follow PEP 8 style guide > Type hints required in Python code > Docstrings required for all public APIs Files: - `tests/test_network_config.py` - `cortex/network_config.py` - `cortex/cli.py` </details> <details> <summary>tests/**/*.py</summary> **📄 CodeRabbit inference engine (AGENTS.md)** > Maintain >80% test coverage for pull requests Files: - `tests/test_network_config.py` </details> </details><details> <summary>🧬 Code graph analysis (2)</summary> <details> <summary>tests/test_network_config.py (1)</summary><blockquote> <details> <summary>cortex/network_config.py (17)</summary> * `_detect_env_proxy` (105-112) * `_detect_gnome_proxy` (114-155) * `_detect_system_proxy` (157-189) * `detect_proxy` (73-103) * `_parse_proxy_url` (191-193) * `detect_vpn` (197-226) * `check_connectivity` (230-259) * `detect_network_quality` (261-277) * `configure_apt_proxy` (281-313) * `configure_pip_proxy` (315-324) * `get_httpx_proxy_config` (326-346) * `cleanup_apt_proxy` (419-436) * `cache_package_list` (350-367) * `get_cached_packages` (369-402) * `enable_offline_fallback` (404-417) * `auto_configure` (438-477) * `print_summary` (481-499) </details> </blockquote></details> <details> <summary>cortex/cli.py (1)</summary><blockquote> <details> <summary>cortex/network_config.py (2)</summary> * `NetworkConfig` (25-499) * `auto_configure` (438-477) </details> </blockquote></details> </details><details> <summary>🪛 GitHub Actions: CI</summary> <details> <summary>cortex/network_config.py</summary> [error] 52-52: ruff check failed: W293 Blank line contains whitespace. (Command: 'ruff check . --output-format=github') </details> </details> <details> <summary>🪛 GitHub Check: Lint</summary> <details> <summary>cortex/network_config.py</summary> [failure] 567-567: Ruff (W293) cortex/network_config.py:567:1: W293 Blank line contains whitespace --- [failure] 399-399: Ruff (W293) cortex/network_config.py:399:1: W293 Blank line contains whitespace --- [failure] 395-395: Ruff (W293) cortex/network_config.py:395:1: W293 Blank line contains whitespace --- [failure] 391-391: Ruff (W293) cortex/network_config.py:391:1: W293 Blank line contains whitespace --- [failure] 388-388: Ruff (W293) cortex/network_config.py:388:1: W293 Blank line contains whitespace --- [failure] 380-380: Ruff (W293) cortex/network_config.py:380:1: W293 Blank line contains whitespace --- [failure] 366-366: Ruff (UP024) cortex/network_config.py:366:16: UP024 Replace aliased errors with `OSError` --- [failure] 358-358: Ruff (W293) cortex/network_config.py:358:1: W293 Blank line contains whitespace --- [failure] 345-345: Ruff (W293) cortex/network_config.py:345:1: W293 Blank line contains whitespace --- [failure] 52-52: Ruff (W293) cortex/network_config.py:52:1: W293 Blank line contains whitespace </details> </details> <details> <summary>🪛 markdownlint-cli2 (0.18.1)</summary> <details> <summary>docs/NETWORK_CONFIG.md</summary> 25-25: Fenced code blocks should have a language specified (MD040, fenced-code-language) --- 281-281: Fenced code blocks should have a language specified (MD040, fenced-code-language) --- 316-316: Fenced code blocks should have a language specified (MD040, fenced-code-language) --- 321-321: Fenced code blocks should have a language specified (MD040, fenced-code-language) </details> <details> <summary>docs/NETWORK_CONFIG_TESTS.md</summary> 30-30: Emphasis used instead of a heading (MD036, no-emphasis-as-heading) </details> </details> </details> <details> <summary>⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)</summary> * GitHub Check: Agent </details> <details> <summary>🔇 Additional comments (13)</summary><blockquote> <details> <summary>cortex/cli.py (4)</summary><blockquote> `14-14`: **LGTM!** The NetworkConfig import is correctly placed and used for the startup auto-configuration. --- `771-771`: **LGTM!** The help table entry for the notify command is consistent with the other entries. --- `804-811`: **LGTM - Good defensive coding for startup configuration.** The network auto-configuration is appropriately wrapped in a try/except block to prevent startup failures from blocking CLI execution. The `auto_configure()` method sets environment variables (for pip proxy) that persist for the process lifetime, so not storing the `network` instance is acceptable. --- `938-939`: **LGTM!** The notify command handler follows the same pattern as other command handlers in the CLI. </blockquote></details> <details> <summary>docs/NETWORK_CONFIG_TESTS.md (2)</summary><blockquote> `1-31`: **LGTM - Comprehensive test documentation.** The test documentation is well-structured with clear descriptions of test classes, counts, and purposes. The test counts align with the implementation in `tests/test_network_config.py`. --- `162-176`: **LGTM - Clear usage examples.** The pytest commands are well-documented with examples for running specific test classes and coverage reports. </blockquote></details> <details> <summary>docs/NETWORK_CONFIG.md (1)</summary><blockquote> `1-21`: **LGTM - Excellent module documentation.** The documentation thoroughly covers the NetworkConfig module features, architecture, and usage patterns. The security warning for credential embedding at line 365 is particularly valuable. </blockquote></details> <details> <summary>tests/test_network_config.py (3)</summary><blockquote> `26-56`: **LGTM - Initialization tests are well-structured.** Tests properly isolate the initialization logic by mocking `_detect_all` and verify default values, forced proxy, offline mode, and cache directory creation. --- `282-302`: **LGTM - Network quality tests correctly use time.time mocking.** The tests properly mock `time.time` with side_effect to simulate different latencies and verify the quality thresholds. --- `631-660`: **LGTM - Integration tests provide good end-to-end coverage.** The integration tests verify the full detection flow and offline mode workflow with appropriate mocking of system calls. </blockquote></details> <details> <summary>cortex/network_config.py (3)</summary><blockquote> `1-23`: **LGTM - Well-documented module with proper imports.** The module docstring clearly describes the purpose, and imports are appropriately organized. Type hints are used consistently throughout the module. --- `25-70`: **LGTM - NetworkConfig class has good initialization and detection flow.** The class properly initializes state, creates the cache directory, and conditionally runs detection based on offline mode. The `_detect_all` method cleanly orchestrates the detection sequence. --- `438-477`: **LGTM - auto_configure handles all scenarios gracefully.** The method properly handles offline mode, no internet connectivity, proxy configuration, and VPN detection with appropriate user feedback. </blockquote></details> </blockquote></details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR implements comprehensive network configuration and proxy detection for Cortex Linux, enabling the package manager to work seamlessly in corporate networks with proxies, behind VPNs, and in offline environments. The implementation auto-detects proxy settings from multiple sources (environment variables, GNOME settings, system files), handles VPN connections, supports proxy authentication, and provides graceful offline fallback with package caching.
Key Changes:
- Automatic proxy detection from environment variables, GNOME settings, and system configuration files
- VPN detection support for OpenVPN, WireGuard, and IPSec
- Network connectivity and quality testing with multiple fallback mechanisms
- Automatic configuration of apt and pip to use detected proxies
- Offline mode with JSON-based package caching
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 18 comments.
Show a summary per file
| File | Description |
|---|---|
cortex/network_config.py |
Main network configuration module with proxy detection, VPN detection, connectivity testing, and configuration methods (572 lines) |
tests/test_network_config.py |
Comprehensive test suite with 58 tests organized into 9 test classes covering all major functionality |
docs/NETWORK_CONFIG.md |
Complete module documentation with architecture diagrams, API reference, usage examples, and troubleshooting guide |
docs/NETWORK_CONFIG_TESTS.md |
Test documentation describing test structure, coverage goals, mocking strategies, and guidelines for adding tests |
cortex/cli.py |
Integration of network auto-configuration into CLI startup sequence |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (6)
tests/test_network_config.py (2)
50-55: Unused variableconfig.The
configvariable is assigned but never used. Either use it in an assertion or remove the assignment.🔎 Proposed fix
def test_cache_dir_created(self): """Test cache directory is created on init.""" with patch.object(NetworkConfig, "detect"): with patch("pathlib.Path.mkdir") as mock_mkdir: - config = NetworkConfig() + NetworkConfig() mock_mkdir.assert_called_once_with(parents=True, exist_ok=True)
166-170: Remove trailing parentheses frommock_opencall.The
mock_open(read_data=apt_content)()pattern at line 169 is non-idiomatic. The trailing()calls the mock, which can cause unexpected behavior. Use the standard pattern:🔎 Proposed fix
with patch("builtins.open") as mock_file: mock_file.side_effect = [ FileNotFoundError(), # proxy.conf doesn't exist - mock_open(read_data=apt_content)(), # apt.conf exists + mock_open(read_data=apt_content), # apt.conf exists ]cortex/network_config.py (4)
16-16: Remove unused importOptional.The
Optionaltype hint fromtypingis imported but not used. The code uses the modernX | Noneunion syntax instead.🔎 Proposed fix
from pathlib import Path -from typing import Optional from urllib.parse import quote
228-229: Consider adding explanatory comments for emptyexceptclauses.The empty
except: passblocks are intentional for graceful degradation when theipcommand is unavailable, but a brief comment would clarify the intent for future maintainers.🔎 Proposed fix
except (FileNotFoundError, subprocess.CalledProcessError): - pass + pass # ip command unavailable or failed; continue to route check # Check routing table try: result = subprocess.check_output(["ip", "route"], stderr=subprocess.DEVNULL).decode() if "tun" in result or "ppp" in result: console.print("[dim] VPN connection detected[/dim]") return True except (FileNotFoundError, subprocess.CalledProcessError): - pass + pass # ip command unavailable or failed; assume no VPNAlso applies to: 237-238
293-294: Redundant exception:requests.Timeoutis a subclass ofrequests.RequestException.Catching both is unnecessary since
requests.RequestExceptionalready coversrequests.Timeout.🔎 Proposed fix
- except (requests.RequestException, requests.Timeout): + except requests.RequestException: return "offline"
548-549: Redundant exception:requests.Timeoutis a subclass ofrequests.RequestException.Same issue as in
detect_network_quality. Catching both is unnecessary.🔎 Proposed fix
- except (requests.RequestException, requests.Timeout): + except requests.RequestException: pass
🧹 Nitpick comments (1)
tests/test_network_config.py (1)
13-15: Remove unused imports.
MagicMockis imported but not used in any test. Similarly,pytestis imported at module level but not referenced directly (tests run via pytest but don't use pytest-specific features like fixtures or markers).🔎 Proposed fix
-from unittest.mock import MagicMock, Mock, mock_open, patch +from unittest.mock import Mock, mock_open, patch -import pytest
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
cortex/network_config.pytests/test_network_config.py
🧰 Additional context used
📓 Path-based instructions (2)
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Follow PEP 8 style guide
Type hints required in Python code
Docstrings required for all public APIs
Files:
cortex/network_config.pytests/test_network_config.py
tests/**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
Maintain >80% test coverage for pull requests
Files:
tests/test_network_config.py
🧬 Code graph analysis (1)
tests/test_network_config.py (1)
cortex/network_config.py (20)
NetworkConfig(27-520)check_proxy_auth(526-551)prompt_proxy_credentials(554-564)_detect_env_proxy(118-125)_detect_gnome_proxy(127-169)_detect_system_proxy(171-203)detect_proxy(86-116)_parse_proxy_url(205-207)detect_vpn(211-240)check_connectivity(244-276)detect_network_quality(278-294)configure_apt_proxy(298-332)configure_pip_proxy(334-345)get_httpx_proxy_config(347-367)cleanup_apt_proxy(440-457)cache_package_list(371-388)get_cached_packages(390-423)enable_offline_fallback(425-438)auto_configure(459-498)print_summary(502-520)
🔇 Additional comments (11)
tests/test_network_config.py (5)
204-246: LGTM!VPN detection tests cover the key scenarios: tun interface, WireGuard, no VPN present, and graceful handling when the
ipcommand is unavailable.
248-312: LGTM!Connectivity tests properly cover DNS resolution success, HTTP fallback when DNS fails, and network quality detection with time mocking.
314-417: LGTM!Configuration tests comprehensively cover apt proxy setup (success, no proxy, permission denied), pip proxy environment variable setup, httpx proxy config generation for HTTP/HTTPS/SOCKS, and cleanup scenarios.
419-513: LGTM!Package caching tests thoroughly cover cache creation, IO error handling, successful retrieval, cache expiration, missing files, invalid JSON parsing, and offline fallback scenarios.
515-660: LGTM!The remaining test classes provide solid coverage:
TestAutoConfigurevalidates offline mode, proxy configuration, and VPN detection flowsTestHelperFunctionscovers proxy auth checking, credential prompting, and URL constructionTestPrintSummaryensures summary output doesn't raise exceptionsTestIntegrationvalidates full detection and offline mode flowsThe test suite provides comprehensive coverage of the NetworkConfig module.
cortex/network_config.py (6)
39-62: LGTM!The initialization properly supports lazy loading via
auto_detectparameter, and thedetect()method has idempotency protection with the_detectedflag.
86-208: LGTM!Proxy detection implementation is well-structured with clear priority order (environment → GNOME → system files), proper error handling, and support for HTTP/HTTPS/SOCKS proxies.
298-368: LGTM!Configuration methods properly:
- Use separate HTTP/HTTPS proxy URLs with fallback
- Handle sudo for apt configuration
- Support SOCKS proxies in httpx config
371-438: LGTM!Package caching implementation properly handles:
- Writing cache with timestamp
- Reading with age validation
- Graceful degradation on IO errors
- User-friendly offline fallback messages
440-521: LGTM!The cleanup, auto-configuration, and summary methods are well-implemented:
cleanup_apt_proxysafely removes the config fileauto_configureproperly orchestrates offline mode, proxy configuration, and VPN detectionprint_summaryprovides clear, formatted output
567-594: LGTM!The
add_proxy_authfunction properly:
- URL-encodes credentials to handle special characters (
@,:,/,%)- Documents the security implications in the docstring
- Logs a warning about credential embedding
- Handles both protocol-prefixed and bare URLs
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
test_parallel_llm.py (1)
1-1: Fix Black formatting before merge - pipeline failing.The CI pipeline is failing because the file doesn't conform to Black formatting. Run
black .to automatically apply the correct formatting.#!/bin/bash # Apply Black formatting to fix the CI failure black test_parallel_llm.py
🧹 Nitpick comments (2)
cortex/network_config.py (2)
38-64: Consider defaulting auto_detect to False for faster CLI startup.While the
auto_detectparameter addresses the slow initialization concern from past reviews, it defaults toTrue, meaning detection still runs during construction by default. For CLI tools where fast startup matters, consider defaulting toFalseand having callers explicitly trigger detection via.detect()when needed, or document that initialization may be slow.
352-372: Consider more specific return type hint.The return type
dict | Nonecould be more specific asdict[str, str] | Noneto improve type safety and match the pattern used elsewhere in the class.🔎 Proposed fix
- def get_httpx_proxy_config(self) -> dict | None: + def get_httpx_proxy_config(self) -> dict[str, str] | None:
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
cortex/network_config.pyexamples/parallel_llm_demo.pytest_parallel_llm.pytests/test_network_config.py
✅ Files skipped from review due to trivial changes (1)
- examples/parallel_llm_demo.py
🚧 Files skipped from review as they are similar to previous changes (1)
- tests/test_network_config.py
🧰 Additional context used
📓 Path-based instructions (1)
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Follow PEP 8 style guide
Type hints required in Python code
Docstrings required for all public APIs
Files:
test_parallel_llm.pycortex/network_config.py
🧬 Code graph analysis (2)
test_parallel_llm.py (1)
cortex/llm_router.py (1)
acomplete(441-505)
cortex/network_config.py (3)
cortex/logging_system.py (2)
debug(194-196)warning(202-204)cortex/kernel_features/llm_device.py (1)
open(158-159)cortex/user_preferences.py (1)
load(117-148)
🪛 GitHub Actions: CI
test_parallel_llm.py
[error] 1-1: Black formatting would reformat this file. Run 'black .' to apply formatting changes.
cortex/network_config.py
[error] 1-1: Black formatting would reformat this file. Run 'black .' to apply formatting changes.
🪛 GitHub Actions: Cortex Automation
cortex/network_config.py
[error] 292-292: NotImplementedError: only stream sockets are supported raised during network quality detection when performing HTTP HEAD to 'https://1.1.1.1' (proxy/environment SSL context). This occurred while running: 'pytest tests/ -v --cov=cortex --cov-report=xml --cov-report=term-missing'. Investigate SSL context/proxy configuration or mocking of network calls in tests.
🔇 Additional comments (7)
cortex/network_config.py (7)
259-268: LGTM - Socket timeout properly scoped.The socket timeout is correctly applied to the individual socket instance rather than globally, avoiding the issue raised in past reviews.
303-350: LGTM - Proxy configuration correctly handles HTTP and HTTPS separately.Both
configure_apt_proxyandconfigure_pip_proxynow properly respect separate HTTP and HTTPS proxy values with appropriate fallback, addressing concerns from past reviews.
573-600: LGTM - Credentials properly URL-encoded with security warnings.The function now correctly URL-encodes credentials to handle special characters, and includes appropriate security warnings about credential exposure. This addresses concerns from past reviews.
231-243: LGTM - Exception handling with clear comments.The empty except clauses include explanatory comments about why failures are silently ignored during detection, which is appropriate for this probing code.
577-600: Security warnings appropriately documented.The function includes comprehensive security warnings about credential exposure in both the docstring and logging, which is essential for this sensitive operation.
376-428: LGTM - Offline caching implementation is sound.The package caching implementation includes proper age validation, error handling, and logging. The 24-hour default cache age is reasonable for package lists.
464-503: LGTM - Comprehensive auto-configuration with clear user feedback.The auto-configuration orchestration handles offline mode, connectivity issues, proxy setup, and VPN detection gracefully with informative console messages.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (2)
tests/test_network_config.py (2)
13-13: MagicMock IS used in this test file.The Copilot suggestion to remove
MagicMockfrom the import is incorrect.MagicMockis used on lines 262, 273, 278, 289, 303, 314, 654, and 659 throughout the test suite.
161-176: Verify the mock_open pattern on line 172.The past review flagged
mock_open(read_data=apt_content)()on line 172 as non-idiomatic and marked it as "✅ Addressed in commit 45778ae", but the trailing()still appears in the current code.The standard pattern for mock_open with side_effect should be:
mock_file.side_effect = [ FileNotFoundError(), mock_open(read_data=apt_content).return_value, ]Please verify whether this test actually passes as-is, or if the pattern needs to be corrected per the previous review.
Run this test in isolation to confirm it works correctly:
#!/bin/bash cd tests && python -m pytest test_network_config.py::TestProxyDetection::test_detect_system_proxy_from_apt_conf -xvs
🧹 Nitpick comments (1)
tests/test_network_config.py (1)
50-55: Remove unused variable assignment.The
configvariable on line 54 is assigned but never used afterward. The test only verifies thatmkdirwas called through the mock.🔎 Proposed fix
def test_cache_dir_created(self): """Test cache directory is created on init.""" with patch.object(NetworkConfig, "detect"): with patch("pathlib.Path.mkdir") as mock_mkdir: - config = NetworkConfig() + NetworkConfig() mock_mkdir.assert_called_once_with(parents=True, exist_ok=True)
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
cortex/llm_router.pycortex/network_config.pyexamples/parallel_llm_demo.pytest_parallel_llm.pytests/test_llm_router.pytests/test_network_config.py
✅ Files skipped from review due to trivial changes (3)
- tests/test_llm_router.py
- cortex/llm_router.py
- examples/parallel_llm_demo.py
🚧 Files skipped from review as they are similar to previous changes (1)
- test_parallel_llm.py
🧰 Additional context used
📓 Path-based instructions (2)
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Follow PEP 8 style guide
Type hints required in Python code
Docstrings required for all public APIs
Files:
tests/test_network_config.pycortex/network_config.py
tests/**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
Maintain >80% test coverage for pull requests
Files:
tests/test_network_config.py
🔇 Additional comments (1)
cortex/network_config.py (1)
1-607: Implementation looks solid after past review fixes.The
cortex/network_config.pyimplementation has addressed all previously flagged issues:
- Socket timeout now uses instance-level
settimeout()instead of global timeout- Credentials are properly URL-encoded using
quote()- Separate handling of HTTP and HTTPS proxies in apt and pip configuration
- Proper error handling with OSError (IOError redundancy removed)
- Module-level imports for all dependencies
The code follows PEP 8, includes comprehensive type hints and docstrings, and demonstrates good error handling throughout.
…exlinux#25) - Add NetworkConfig class with auto-detection for proxies (HTTP/HTTPS/SOCKS) - Support proxy detection from env vars, GNOME settings, and system files - Implement VPN detection (OpenVPN, WireGuard, IPSec) - Add connectivity testing with DNS and HTTP fallback - Implement offline mode with package caching - Add proxy authentication helpers - Configure apt and pip for detected proxies - Add 58 comprehensive tests with >80% coverage - Add complete documentation for module and tests Resolves cortexlinux#25
Major fixes: - Add lazy loading support (auto_detect parameter) for faster CLI startup - Fix global socket timeout with proper context manager - URL-encode credentials in add_proxy_auth to handle special characters - Use separate HTTP/HTTPS proxy URLs in apt and pip configuration - Move getpass import to module level - Rename _detect_all to detect() as public API - Add ProtonVPN, NordVPN, Mullvad VPN detection support Minor fixes: - Remove redundant requests.Timeout exception - Fix trailing whitespace on blank lines - Add urllib.parse.quote import for URL encoding - Update all tests to use new detect() method name All 58 tests passing ✅
458cf8e to
f38fc4a
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
cortex/cli.pycortex/network_config.pydocs/NETWORK_CONFIG.mddocs/NETWORK_CONFIG_TESTS.mdtests/test_network_config.py
🚧 Files skipped from review as they are similar to previous changes (2)
- cortex/cli.py
- tests/test_network_config.py
🧰 Additional context used
📓 Path-based instructions (1)
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Follow PEP 8 style guide
Type hints required in Python code
Docstrings required for all public APIs
Files:
cortex/network_config.py
🪛 markdownlint-cli2 (0.18.1)
docs/NETWORK_CONFIG_TESTS.md
25-25: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: Build Package
- GitHub Check: test (3.11)
- GitHub Check: test (3.12)
- GitHub Check: test (3.10)
🔇 Additional comments (9)
cortex/network_config.py (7)
1-24: LGTM - Imports and module setup are clean.All imports are properly organized and used throughout the module. The module-level import of
getpass(line 8) andurllib.parse.quote(line 16) correctly address previous review concerns.
38-66: Good design - lazy loading option addresses initialization concerns.The
auto_detectparameter (line 39) allows callers to defer expensive network detection until needed, addressing previous concerns about slow initialization. The_detectedflag (line 56) prevents redundant detection calls. This is a solid pattern for CLI tools where startup time matters.
261-270: Excellent fix - socket timeout is now instance-scoped.The connectivity check now uses
sock.settimeout(timeout)(line 264) on the socket instance rather than modifying global state. This correctly addresses the previous review concern aboutsocket.setdefaulttimeout()affecting other parts of the application.
305-356: Proxy configuration correctly handles separate HTTP/HTTPS proxies.Both
configure_apt_proxy()(line 318) andconfigure_pip_proxy()(line 349) now useself.proxy.get("https", http_proxy)to properly respect distinct HTTPS proxy settings when available, while falling back to the HTTP proxy. This addresses previous review feedback about supporting different proxies for different protocols.
580-607: Well-implemented - credentials are now properly URL-encoded.The function now uses
quote(username, safe="")andquote(password, safe="")(lines 597-598) to properly handle special characters like@,:,/, and%in proxy credentials. The security warning (lines 584-586, 600) appropriately alerts users about credential visibility risks. This correctly addresses the previous major security concern.
538-564: LGTM - proxy authentication check is correctly implemented.The exception handling properly catches
requests.exceptions.ProxyErrorfor 407 status (lines 557-559) and falls back to a generic failure for other request exceptions (line 560). The code does not redundantly catch bothTimeoutandRequestExceptionas mentioned in older comments.
1-607: Comprehensive implementation with excellent improvements from prior reviews.This module successfully addresses all previously identified critical and major issues:
- ✅ Socket timeout now instance-scoped (line 264)
- ✅ URL encoding for proxy credentials (lines 597-598)
- ✅ Separate HTTP/HTTPS proxy support (lines 318, 349)
- ✅ Lazy loading via
auto_detectparameter (line 39)- ✅ Proper error handling throughout
The code follows PEP 8, includes comprehensive docstrings, and provides strong type hints for public APIs. One minor issue remains regarding explanatory comments in empty except clauses (flagged separately).
docs/NETWORK_CONFIG_TESTS.md (1)
1-228: Excellent test documentation - comprehensive and well-structured.The documentation thoroughly covers all 58 tests, organized by test class with clear descriptions. Mocking strategies, running commands, and coverage goals are well-documented. The static analysis hint about line 25 appears to be a false positive—all fenced code blocks in this file correctly specify their language (bash at lines 164-176, python at lines 213-223).
docs/NETWORK_CONFIG.md (1)
1-473: Outstanding module documentation - thorough and user-friendly.This documentation provides comprehensive coverage of the NetworkConfig module with:
- Clear architecture diagrams (lines 25-58)
- Practical usage examples with proper code formatting
- Complete API reference with parameter tables
- Detailed troubleshooting guidance
- Security warnings for proxy credential handling (line 365)
All code blocks are properly tagged with language specifiers, and the content is well-organized for both quick reference and deep understanding. This will significantly aid users working with corporate proxies and VPNs.
ignoring SonarQube since the warning are on test files |
|
@ShreeJejurikar @Suyashd999 The PR fulfills the requirements of the Issue #25 so its ready to merge after these adding these minor tweaks that will improve the performance of the CLI. Issues Found:
Suggested Improvements1. Lazy Loading in CLI (CRITICAL FIX)Before: network = NetworkConfig() # 2.2 seconds - runs full detection
network.auto_configure()After: network = NetworkConfig(auto_detect=False) # 0.1ms - instant
# Only detect when actually needed
if args.command in ['install', 'update', 'upgrade', 'search', 'doctor']:
network.detect()
network.auto_configure()Performance improvement:
2. Optional Network Quality CheckBefore: def detect(self):
# Always checks quality (1-5s delay)
if self.is_online:
self.connection_quality = self.detect_network_quality()After: def detect(self, check_quality: bool = False):
# Only check quality if explicitly requested
if self.is_online and check_quality:
self.connection_quality = self.detect_network_quality()Performance improvement:
|
- Comprehensive thread-safety audit and fixes for 15 modules - Added SQLite connection pooling infrastructure (db_pool.py) - Added locks for singletons and shared state - Created parallel LLM architecture design document (1,053 lines) - Added comprehensive thread-safety test suite - All 656 tests passing with stress testing verified - Documentation: 5 files totaling 15,000+ lines Thread-safety protection added to: - 3 singleton patterns (transaction_history, hardware_detection, graceful_degradation) - 7 database modules with connection pooling (semantic_cache, context_memory, etc.) - 5 modules with explicit locks (progress_indicators, config_manager, llm_router, etc.) Stress tested: 1,400+ threads, 4,950 operations, zero race conditions Fixes #273
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
- Fixed import sorting (I001) - Removed trailing whitespace (W291, W293) - Fixed f-string placeholders (F541) - Updated imports from collections.abc (UP035) All 656 tests still passing. No functional changes.
…ction pool timeout test
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (5)
cortex/llm_router.py (1)
429-434:reset_statsis missing lock protection.While
_update_statsandget_statsare protected by_stats_lock,reset_statsmutates the same shared state without acquiring the lock. This could cause inconsistent state if called concurrently with other stat operations.🔎 Proposed fix
def reset_stats(self): """Reset all usage statistics.""" - self.total_cost_usd = 0.0 - self.request_count = 0 - for provider in self.provider_stats: - self.provider_stats[provider] = {"requests": 0, "tokens": 0, "cost": 0.0} + with self._stats_lock: + self.total_cost_usd = 0.0 + self.request_count = 0 + for provider in self.provider_stats: + self.provider_stats[provider] = {"requests": 0, "tokens": 0, "cost": 0.0}cortex/installation_history.py (3)
284-312: Critical bug:conn.commit()is outside the connection context.Line 306 calls
conn.commit()after thewith self._pool.get_connection()block ends at line 304. At that point, the connection has already been returned to the pool and may be in use by another thread, causing data corruption or errors.🔎 Proposed fix
1, # rollback_available None, # duration ), ) - conn.commit() + conn.commit() logger.info(f"Installation {install_id} recorded") return install_id
314-363: Critical bug: Multiple statements execute outside the connection context.Lines 333-358 (including
start_timeparsing, snapshot creation, and the UPDATE query) execute after thewith self._pool.get_connection()block ends at line 332. Thecursorandconnobjects are used after the connection is returned to the pool.🔎 Proposed fix - wrap all database operations in the context
try: with self._pool.get_connection() as conn: cursor = conn.cursor() # Get packages from record cursor.execute( "SELECT packages, timestamp FROM installations WHERE id = ?", (install_id,) ) result = cursor.fetchone() if not result: logger.error(f"Installation {install_id} not found") return packages = json.loads(result[0]) - start_time = datetime.datetime.fromisoformat(result[1]) - duration = (datetime.datetime.now() - start_time).total_seconds() - - # Create after snapshot - after_snapshot = self._create_snapshot(packages) - - # Update record - cursor.execute( - """ - UPDATE installations - SET status = ?, - after_snapshot = ?, - error_message = ?, - duration_seconds = ? - WHERE id = ? - """, - ( - status.value, - json.dumps([asdict(s) for s in after_snapshot]), - error_message, - duration, - install_id, - ), - ) - - conn.commit() + start_time = datetime.datetime.fromisoformat(result[1]) + duration = (datetime.datetime.now() - start_time).total_seconds() + + # Create after snapshot (note: this calls subprocess, consider if it should be outside) + after_snapshot = self._create_snapshot(packages) + + # Update record + cursor.execute( + """ + UPDATE installations + SET status = ?, + after_snapshot = ?, + error_message = ?, + duration_seconds = ? + WHERE id = ? + """, + ( + status.value, + json.dumps([asdict(s) for s in after_snapshot]), + error_message, + duration, + install_id, + ), + ) + + conn.commit()
423-455: Bug:rowis used after the connection context ends.The
with self._pool.get_connection()block ends at line 434, butrowis used in lines 436-452 to construct theInstallationRecord. While this may work becauserowis a tuple fetched before exiting, it's inconsistent with other methods and the pattern is error-prone.🔎 Proposed fix - move record construction inside the context
try: with self._pool.get_connection() as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM installations WHERE id = ?", (install_id,)) row = cursor.fetchone() if not row: return None - return InstallationRecord( - id=row[0], - timestamp=row[1], - operation_type=InstallationType(row[2]), - packages=json.loads(row[3]) if row[3] else [], - status=InstallationStatus(row[4]), - before_snapshot=[ - PackageSnapshot(**s) for s in (json.loads(row[5]) if row[5] else []) - ], - after_snapshot=[ - PackageSnapshot(**s) for s in (json.loads(row[6]) if row[6] else []) - ], - commands_executed=json.loads(row[7]) if row[7] else [], - error_message=row[8], - rollback_available=bool(row[9]) if row[9] is not None else True, - duration_seconds=row[10], - ) + return InstallationRecord( + id=row[0], + timestamp=row[1], + operation_type=InstallationType(row[2]), + packages=json.loads(row[3]) if row[3] else [], + status=InstallationStatus(row[4]), + before_snapshot=[ + PackageSnapshot(**s) for s in (json.loads(row[5]) if row[5] else []) + ], + after_snapshot=[ + PackageSnapshot(**s) for s in (json.loads(row[6]) if row[6] else []) + ], + commands_executed=json.loads(row[7]) if row[7] else [], + error_message=row[8], + rollback_available=bool(row[9]) if row[9] is not None else True, + duration_seconds=row[10], + ) except Exception as e:cortex/hardware_detection.py (1)
645-653: Race condition:get_detector()singleton lacks thread-safe initialization.The
get_detector()function uses a check-then-act pattern without synchronization. Under Python 3.14 free-threading, multiple threads can simultaneously see_detector_instance is Noneand create multiple instances.The PR documentation (PYTHON_314_COMPLETE_IMPLEMENTATION.md lines 42-46) claims this is fixed, but the implementation still lacks a lock.
🔎 Proposed fix using double-checked locking
_detector_instance = None +_detector_lock = threading.Lock() def get_detector() -> HardwareDetector: """Get the global hardware detector instance.""" global _detector_instance if _detector_instance is None: - _detector_instance = HardwareDetector() + with _detector_lock: + if _detector_instance is None: + _detector_instance = HardwareDetector() return _detector_instance
♻️ Duplicate comments (2)
cortex/cli.py (1)
807-828: Network configuration doesn't respect the--offlineflag.The network detection runs before the main argument parser processes
--offline. When a user runscortex install nginx --offline, the network detection still occurs. Consider checking for--offlinein the preliminary parse or deferring network config until after full argument parsing.This was previously flagged in an earlier review. The current implementation parses only the command but not global flags like
--offline.🔎 Suggested approach
temp_parser = argparse.ArgumentParser(add_help=False) temp_parser.add_argument('command', nargs='?') + temp_parser.add_argument('--offline', action='store_true') temp_args, _ = temp_parser.parse_known_args() # Commands that need network detection NETWORK_COMMANDS = ['install', 'update', 'upgrade', 'search', 'doctor', 'stack'] - if temp_args.command in NETWORK_COMMANDS: + if temp_args.command in NETWORK_COMMANDS and not temp_args.offline: # Now detect network (only when needed) network.detect(check_quality=True) # Include quality check for these commands network.auto_configure()cortex/network_config.py (1)
88-88: Fix trailing whitespace on line 88 - CI failing.The static analysis indicates this blank line contains trailing whitespace, which is causing the lint check to fail.
This was previously flagged. Run
sed -i 's/[[:space:]]*$//' cortex/network_config.pyto fix all trailing whitespace.
🧹 Nitpick comments (9)
cortex/demo.py (1)
20-22: GPU availability check is slightly redundant but safe.The condition
gpu and len(gpu) > 0is technically redundant since a truthy list implies non-empty. However, this is a minor style preference and the code is correct.🔎 Optional simplification
gpu = hw.gpu - if gpu and len(gpu) > 0: + if gpu: print(f"✔ GPU: {gpu[0].model}") else: print("⚠️ GPU: Not detected (CPU mode enabled)") # 2️⃣ Model Recommendations print("\n🤖 Model Recommendations:") - if gpu and len(gpu) > 0: + if gpu: print("• LLaMA-3-8B → Optimized for your GPU")Also applies to: 28-33
docs/PYTHON_314_ANALYSIS_SUMMARY.md (2)
32-43: Add language specifiers to fenced code blocks.The performance comparison code blocks at lines 33-36 and 39-42 are missing language specifiers. This helps with syntax highlighting and satisfies markdown lint rules.
🔎 Proposed fix
**Current (with GIL)**: -``` +```bash cortex install nginx redis postgresql docker nodejs → 18 seconds (mostly sequential) ``` **With Free-Threading (after fixes)**: -``` +```bash cortex install nginx redis postgresql docker nodejs → 10 seconds (45% faster) ```
91-93: Fix list indentation for markdown lint compliance.Lines 92-93 have 3-space indentation instead of the expected 0. This appears to be intentional sub-items under line 91, but the markdown linter expects consistent indentation.
🔎 Proposed fix
9-11. **kernel_features/** modules - - **Issue**: SQLite write conflicts - - **Fix**: Connection pooling + - **Issue**: SQLite write conflicts + - **Fix**: Connection poolingAlternatively, restructure as:
-9-11. **kernel_features/** modules - - **Issue**: SQLite write conflicts - - **Fix**: Connection pooling +9. **kernel_features/** modules + - **Issue**: SQLite write conflicts + - **Fix**: Connection poolingcortex/transaction_history.py (1)
25-26: Movethreadingimport to the top of the file.The
threadingimport is placed after theloggerinitialization (line 22), which is unconventional. Following PEP 8, imports should be at the top of the file, grouped with other standard library imports.🔎 Proposed fix
Move
import threadingto the top of the file with other standard library imports:import hashlib import json import logging import os import sqlite3 import subprocess +import threading from dataclasses import asdict, dataclass, field from datetime import datetime from enum import Enum from pathlib import Path from typing import Any logger = logging.getLogger(__name__) - - -import threading # For thread-safe singleton patterncortex/kernel_features/accelerator_limits.py (1)
9-9: Remove unusedsqlite3import on line 9.The file has migrated to connection pooling via
get_connection_pool()fromcortex.utils.db_pool. Thesqlite3module is imported but never used anywhere in the file.cortex/dependency_resolver.py (1)
97-99: Minor: Log statement inside lock slightly extends lock hold time.The
logger.infocall on line 99 is inside the lock. While this is safe and the log operation is fast, moving it outside the lock would minimize the critical section. This is a minor optimization and not required.🔎 Optional refactor to minimize lock scope
with self._packages_lock: self.installed_packages = new_packages - logger.info(f"Found {len(self.installed_packages)} installed packages") + count = len(self.installed_packages) + logger.info(f"Found {count} installed packages")docs/PYTHON_314_DEVELOPER_CHECKLIST.md (1)
477-478: Minor formatting nit: Add comma after year in date.Per style conventions, a comma should follow the year in month-day-year date format.
-**Last Updated**: December 22, 2025 +**Last Updated**: December 22, 2025,cortex/kernel_features/kv_cache_manager.py (1)
121-128: Encapsulation concern: Direct access to private_poolattribute.
KVCacheManager.destroy_poolaccessesself.db._pooldirectly, which breaks encapsulation. Consider adding a method toCacheDatabasefor deleting pool records.🔎 Proposed refactor to improve encapsulation
Add a method to
CacheDatabase:def delete_pool(self, name: str) -> None: """Delete a pool record from the database.""" with self._pool.get_connection() as conn: conn.execute("DELETE FROM pools WHERE name=?", (name,)) conn.commit()Then update
KVCacheManager.destroy_pool:def destroy_pool(self, name: str) -> bool: if name in self.pools: self.pools[name].destroy() del self.pools[name] - with self.db._pool.get_connection() as conn: - conn.execute("DELETE FROM pools WHERE name=?", (name,)) + self.db.delete_pool(name) print(f"✅ Destroyed pool '{name}'") return Truecortex/utils/db_pool.py (1)
86-88: Consider making cache size configurable.The 64MB cache size (
PRAGMA cache_size=-64000) is hardcoded. For systems with limited memory or high-memory scenarios, this could be made configurable via a parameter.🔎 Optional enhancement
def __init__( self, db_path: str | Path, pool_size: int = 5, timeout: float = 5.0, check_same_thread: bool = False, + cache_size_mb: int = 64, ): ... + self.cache_size_mb = cache_size_mb def _create_connection(self) -> sqlite3.Connection: ... # Larger cache for better performance - conn.execute("PRAGMA cache_size=-64000") # 64MB cache + conn.execute(f"PRAGMA cache_size=-{self.cache_size_mb * 1000}") # {cache_size_mb}MB cache
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (24)
cortex/cli.pycortex/config_manager.pycortex/context_memory.pycortex/demo.pycortex/dependency_resolver.pycortex/graceful_degradation.pycortex/hardware_detection.pycortex/installation_history.pycortex/kernel_features/accelerator_limits.pycortex/kernel_features/kv_cache_manager.pycortex/llm_router.pycortex/network_config.pycortex/notification_manager.pycortex/progress_indicators.pycortex/semantic_cache.pycortex/stack_manager.pycortex/transaction_history.pycortex/utils/db_pool.pydocs/PARALLEL_LLM_FREE_THREADING_DESIGN.mddocs/PYTHON_314_ANALYSIS_SUMMARY.mddocs/PYTHON_314_COMPLETE_IMPLEMENTATION.mddocs/PYTHON_314_DEVELOPER_CHECKLIST.mddocs/PYTHON_314_THREAD_SAFETY_AUDIT.mdtests/test_thread_safety.py
🧰 Additional context used
📓 Path-based instructions (3)
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Follow PEP 8 style guide
Type hints required in Python code
Docstrings required for all public APIs
Files:
tests/test_thread_safety.pycortex/semantic_cache.pycortex/notification_manager.pycortex/kernel_features/accelerator_limits.pycortex/progress_indicators.pycortex/transaction_history.pycortex/graceful_degradation.pycortex/llm_router.pycortex/utils/db_pool.pycortex/cli.pycortex/hardware_detection.pycortex/context_memory.pycortex/config_manager.pycortex/network_config.pycortex/stack_manager.pycortex/installation_history.pycortex/dependency_resolver.pycortex/kernel_features/kv_cache_manager.pycortex/demo.py
tests/**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
Maintain >80% test coverage for pull requests
Files:
tests/test_thread_safety.py
**/*install*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*install*.py: Dry-run by default for all installations in command execution
No silent sudo execution - require explicit user confirmation
Implement audit logging to ~/.cortex/history.db for all package operations
Files:
cortex/installation_history.py
🧠 Learnings (1)
📚 Learning: 2025-12-11T12:03:24.071Z
Learnt from: CR
Repo: cortexlinux/cortex PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-11T12:03:24.071Z
Learning: Applies to **/*install*.py : Implement audit logging to ~/.cortex/history.db for all package operations
Applied to files:
cortex/installation_history.py
🧬 Code graph analysis (13)
tests/test_thread_safety.py (4)
cortex/transaction_history.py (1)
get_history(665-674)cortex/hardware_detection.py (3)
get_detector(648-653)detect_hardware(656-658)detect(205-237)cortex/graceful_degradation.py (3)
get_degradation_manager(512-521)get(109-141)put(143-160)cortex/utils/db_pool.py (4)
get_connection_pool(181-222)get_connection(99-136)close_all(138-153)SQLiteConnectionPool(19-172)
cortex/semantic_cache.py (1)
cortex/utils/db_pool.py (3)
SQLiteConnectionPool(19-172)get_connection_pool(181-222)get_connection(99-136)
cortex/kernel_features/accelerator_limits.py (1)
cortex/utils/db_pool.py (2)
get_connection_pool(181-222)get_connection(99-136)
cortex/graceful_degradation.py (1)
cortex/utils/db_pool.py (3)
SQLiteConnectionPool(19-172)get_connection_pool(181-222)get_connection(99-136)
cortex/utils/db_pool.py (2)
cortex/graceful_degradation.py (2)
put(143-160)get(109-141)cortex/kernel_features/accelerator_limits.py (1)
get(69-72)
cortex/cli.py (1)
cortex/network_config.py (3)
NetworkConfig(26-538)detect(68-93)auto_configure(479-516)
cortex/hardware_detection.py (4)
cortex/user_preferences.py (2)
load(117-148)get(189-208)cortex/transaction_history.py (2)
to_dict(62-63)to_dict(95-111)cortex/first_run_wizard.py (1)
to_dict(62-71)cortex/kernel_features/hardware_detect.py (2)
to_dict(50-53)to_dict(70-75)
cortex/context_memory.py (1)
cortex/utils/db_pool.py (3)
SQLiteConnectionPool(19-172)get_connection_pool(181-222)get_connection(99-136)
cortex/config_manager.py (1)
cortex/kernel_features/llm_device.py (1)
open(158-159)
cortex/installation_history.py (1)
cortex/utils/db_pool.py (3)
SQLiteConnectionPool(19-172)get_connection_pool(181-222)get_connection(99-136)
cortex/dependency_resolver.py (1)
cortex/logging_system.py (1)
info(198-200)
cortex/kernel_features/kv_cache_manager.py (1)
cortex/utils/db_pool.py (2)
get_connection_pool(181-222)get_connection(99-136)
cortex/demo.py (1)
cortex/hardware_detection.py (1)
total_gb(88-89)
🪛 GitHub Actions: CI
cortex/cli.py
[error] 811-811: Ruff check failed with W293: Blank line contains whitespace. (Command: 'ruff check . --output-format=github')
🪛 GitHub Check: lint
cortex/cli.py
[failure] 825-825: Ruff (W293)
cortex/cli.py:825:1: W293 Blank line contains whitespace
[failure] 820-820: Ruff (W293)
cortex/cli.py:820:1: W293 Blank line contains whitespace
[failure] 817-817: Ruff (W293)
cortex/cli.py:817:1: W293 Blank line contains whitespace
[failure] 811-811: Ruff (W293)
cortex/cli.py:811:1: W293 Blank line contains whitespace
cortex/network_config.py
[failure] 88-88: Ruff (W293)
cortex/network_config.py:88:1: W293 Blank line contains whitespace
🪛 GitHub Check: Lint
cortex/cli.py
[failure] 825-825: Ruff (W293)
cortex/cli.py:825:1: W293 Blank line contains whitespace
[failure] 820-820: Ruff (W293)
cortex/cli.py:820:1: W293 Blank line contains whitespace
[failure] 817-817: Ruff (W293)
cortex/cli.py:817:1: W293 Blank line contains whitespace
[failure] 811-811: Ruff (W293)
cortex/cli.py:811:1: W293 Blank line contains whitespace
cortex/network_config.py
[failure] 88-88: Ruff (W293)
cortex/network_config.py:88:1: W293 Blank line contains whitespace
🪛 LanguageTool
docs/PYTHON_314_ANALYSIS_SUMMARY.md
[style] ~3-~3: Some style guides suggest that commas should set off the year in a month-day-year date.
Context: ...lysis - Summary Date: December 22, 2025 Analysis Scope: Full cortex/ dire...
(MISSING_COMMA_AFTER_YEAR)
[style] ~554-~554: Some style guides suggest that commas should set off the year in a month-day-year date.
Context: ...Version**: 1.0 Date: December 22, 2025 Next Review: After Phase 1 comple...
(MISSING_COMMA_AFTER_YEAR)
docs/PARALLEL_LLM_FREE_THREADING_DESIGN.md
[style] ~1056-~1056: Some style guides suggest that commas should set off the year in a month-day-year date.
Context: ...*: 1.0 Last Updated: December 22, 2025 Author: GitHub Copilot (Claude So...
(MISSING_COMMA_AFTER_YEAR)
docs/PYTHON_314_THREAD_SAFETY_AUDIT.md
[style] ~987-~987: Consider using a different verb for a more formal wording.
Context: ... -progress_tracker.py`: Review and fix similar issues - [ ] 2.3: Document asyn...
(FIX_RESOLVE)
[style] ~1140-~1140: Some style guides suggest that commas should set off the year in a month-day-year date.
Context: ...*: 1.0 Last Updated: December 22, 2025 Author: GitHub Copilot (Claude So...
(MISSING_COMMA_AFTER_YEAR)
docs/PYTHON_314_DEVELOPER_CHECKLIST.md
[style] ~477-~477: Some style guides suggest that commas should set off the year in a month-day-year date.
Context: ...te --- Last Updated: December 22, 2025 Status: ✅ Ready for Use
(MISSING_COMMA_AFTER_YEAR)
docs/PYTHON_314_COMPLETE_IMPLEMENTATION.md
[style] ~3-~3: Some style guides suggest that commas should set off the year in a month-day-year date.
Context: ...tion - Complete Date: December 22, 2025 Status: ✅ Production Ready **Ba...
(MISSING_COMMA_AFTER_YEAR)
[uncategorized] ~4-~4: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...te:** December 22, 2025 Status: ✅ Production Ready Backward Compatible: Yes (Python ...
(EN_COMPOUND_ADJECTIVE_INTERNAL)
[uncategorized] ~290-~290: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...nally 2. Existing code works - 100% backward compatible APIs 3. *Connection pooling automatic...
(EN_COMPOUND_ADJECTIVE_INTERNAL)
[style] ~297-~297: This adverb was used twice in the sentence. Consider removing one of them or replacing them with a synonym.
Context: ...ally 2. Database WAL mode - Enabled automatically on first connection 3. **Python version...
(ADVERB_REPETITION_PREMIUM)
🪛 markdownlint-cli2 (0.18.1)
docs/PYTHON_314_ANALYSIS_SUMMARY.md
33-33: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
39-39: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
92-92: Unordered list indentation
Expected: 0; Actual: 3
(MD007, ul-indent)
93-93: Unordered list indentation
Expected: 0; Actual: 3
(MD007, ul-indent)
docs/PARALLEL_LLM_FREE_THREADING_DESIGN.md
33-33: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
82-82: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
116-116: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
178-178: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
710-710: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
841-841: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
docs/PYTHON_314_THREAD_SAFETY_AUDIT.md
661-661: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
680-680: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
764-764: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
1006-1006: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
docs/PYTHON_314_COMPLETE_IMPLEMENTATION.md
33-33: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
39-39: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
92-92: Unordered list indentation
Expected: 0; Actual: 3
(MD007, ul-indent)
93-93: Unordered list indentation
Expected: 0; Actual: 3
(MD007, ul-indent)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: test (3.10)
- GitHub Check: test (3.12)
- GitHub Check: test (3.11)
🔇 Additional comments (51)
cortex/config_manager.py (3)
12-12: Thread-safe file I/O lock initialization looks good.The
threading.Lock()is correctly initialized in__init__to protect file operations on the preferences file. This aligns with the project-wide thread-safety improvements.Also applies to: 58-58
285-287: Thread-safe file read implementation is correct.The double
withstatement properly acquires the lock before opening the file. This prevents race conditions during concurrent reads.
301-303: Thread-safe file write implementation is correct.The lock acquisition before file write prevents data corruption from concurrent writes to
preferences.yaml.cortex/cli.py (2)
109-175: Notify command implementation looks good.The
notify()method properly handles:
- Missing subcommand with helpful error message
- Time format validation for DND window (lines 152-157)
- Required message validation for send action
Minor note: Lines 136, 142, 161 call
mgr._save_config()which is a private method. Consider adding a publicsave_config()method toNotificationManagerfor better encapsulation, but this is a minor refactor for later.
14-14: NetworkConfig import and help table update are correct.The import and help table entry for the notify command are properly integrated.
Also applies to: 774-774
cortex/llm_router.py (4)
165-172: Thread-safe statistics tracking initialization looks good.The
_stats_lockis properly initialized to protect shared mutable state (total_cost_usd,request_count,provider_stats).
393-402: Thread-safe_update_statsimplementation is correct.The lock properly guards all mutations to shared statistics state.
404-427: Thread-safeget_statsimplementation is correct.Returning a snapshot within the lock ensures a consistent view of statistics.
808-808: Minor line change is fine.The system prompt string is unchanged in functionality.
cortex/demo.py (1)
17-24: Hardware detection API migration looks correct.The switch from dict-style to attribute access (
hw.cpu.model,hw.memory.total_gb,hw.gpu) aligns with the dataclass-basedHardwareInfostructure inhardware_detection.py.cortex/stack_manager.py (2)
11-11: Thread-safety infrastructure is correctly added.The
threadingimport and_stacks_lockinitialization properly set up thread-safe stack loading.Also applies to: 25-25
27-45: Double-checked locking pattern is correctly implemented.The implementation follows the correct pattern:
- Fast path check without lock (line 30-31)
- Lock acquisition (line 34)
- Double-check inside lock (line 35-36)
- Initialization and return within lock (lines 38-45)
Error handling for
FileNotFoundErrorandJSONDecodeErroris properly contained within the locked section.cortex/kernel_features/accelerator_limits.py (2)
14-15: Connection pooling migration is correctly implemented.The
get_connection_poolis properly initialized with the database path and pool size. The table creation is correctly executed within a pooled connection context.Also applies to: 58-60
62-79: All database operations correctly use pooled connections.The
save,get, andlist_allmethods properly useself._pool.get_connection()context manager, ensuring connections are returned to the pool after use.docs/PYTHON_314_ANALYSIS_SUMMARY.md (1)
1-556: Excellent documentation for Python 3.14 free-threading migration.This comprehensive analysis document provides valuable guidance for the thread-safety improvements across the codebase, including:
- Clear prioritization of fixes by severity
- Concrete code examples for common patterns
- Testing strategies and performance projections
- Risk assessment and mitigation strategies
cortex/transaction_history.py (2)
658-662: Thread-safe singleton infrastructure is correctly set up.Module-level locks and instance holders are properly initialized for the double-checked locking pattern.
665-686: Double-checked locking pattern is correctly implemented for both singletons.Both
get_history()andget_undo_manager()follow the correct pattern:
- Fast path check without lock
- Lock acquisition
- Double-check inside lock
- Lazy initialization
The forward reference return types (
"TransactionHistory","UndoManager") are appropriate since the functions are defined after the classes.cortex/dependency_resolver.py (2)
68-72: Thread-safety implementation looks correct.The two-lock approach properly separates concerns:
_cache_lockfor the dependency cache and_packages_lockfor installed packages. This allows concurrent cache lookups while package list refreshes are in progress.
219-223: Cache read is properly protected.The cache lookup correctly acquires the lock before checking and returning cached values. This prevents race conditions when multiple threads resolve dependencies for the same package.
cortex/progress_indicators.py (3)
123-145: Well-implemented thread-safe spinner pattern.The implementation correctly:
- Protects shared state (
_running,_current_message,_spinner_idx) with a lock- Takes local copies of state inside the lock (lines 139-141) and uses them outside
- Minimizes lock hold time by only protecting state access, not I/O operations
152-174: Correct lock ordering in stop/fail methods.Good pattern: capturing the thread reference under the lock, then calling
join()outside the lock. This prevents potential deadlocks if the animation thread tries to acquire the lock during shutdown.
662-672: Double-checked locking for global singleton is correct.The pattern follows the standard double-checked locking idiom with a fast path (line 668) and a slow path with lock acquisition and re-check (lines 669-671).
docs/PYTHON_314_DEVELOPER_CHECKLIST.md (1)
1-8: Excellent developer reference documentation.This checklist provides practical, actionable guidance for implementing thread-safety fixes. The before/after code examples match the patterns being applied across the codebase.
cortex/network_config.py (3)
38-66: Good implementation of lazy loading for CLI performance.The
auto_detectparameter (defaulting toTrue) allows CLI commands that don't need network detection (like--help,--version) to skip the ~2s detection overhead by passingauto_detect=False. This directly addresses the performance concern raised in PR comments.
267-276: Proper socket timeout handling.Good fix: using
sock.settimeout(timeout)on the individual socket instead ofsocket.setdefaulttimeout()avoids affecting global socket state. This addresses the previous review feedback.
602-613: Credentials are properly URL-encoded.The
add_proxy_authfunction now usesquote(username, safe="")andquote(password, safe="")to properly encode special characters in credentials. This addresses the previous review feedback about malformed URLs.cortex/kernel_features/kv_cache_manager.py (1)
51-60: Connection pooling correctly integrated.The
CacheDatabaseclass now uses a connection pool for all database operations. Schema initialization properly uses the pool's context manager.cortex/graceful_degradation.py (2)
77-102: Proper connection pool initialization and usage.The
ResponseCacheclass correctly:
- Initializes the pool via
get_connection_pool()(line 82)- Uses the pool's context manager for schema creation
- Commits the transaction after table creation
507-521: Thread-safe singleton with correct double-checked locking.The
get_degradation_manager()function correctly implements the double-checked locking pattern:
- Fast path check without lock (line 516)
- Lock acquisition and re-check (lines 517-520)
- Proper global declaration
cortex/notification_manager.py (3)
37-37: Thread-safety lock correctly initialized.The
_history_lockis initialized after loading history, which is safe since__init__runs in a single-threaded context. Subsequent operations properly use the lock.
66-70: Verify: _save_history expects lock to be held by caller.The docstring states "Caller must hold self._history_lock", which is correct since
_log_history(lines 152-154) acquires the lock before calling_save_history. This is a valid internal contract for private methods.
142-154: Thread-safe history logging implementation.The
_log_historymethod correctly:
- Builds the entry outside the lock (lines 144-151)
- Acquires the lock only for the append and save operations (lines 152-154)
This minimizes lock contention while ensuring thread-safety.
cortex/semantic_cache.py (3)
76-77: Correct type annotation for optional pool.The
_pool: SQLiteConnectionPool | None = Nonetype hint correctly indicates the pool may be None before_init_database()completes.
88-133: Connection pool properly initialized and used for schema creation.The pool is obtained via
get_connection_pool()(line 90), which provides a thread-safe singleton pool for the database path. Schema creation correctly uses the pool's context manager and commits the transaction.
229-290: Database operations correctly use pooled connections.The
get_commandsmethod properly:
- Acquires a connection from the pool via context manager
- Performs all database operations within the context
- Commits after updates
- Connection is automatically returned to pool on exit
cortex/installation_history.py (1)
20-21: Good adoption of the connection pool pattern.The import and initialization of the connection pool are correctly implemented with the pool attribute and
get_connection_pool()call. The database schema initialization correctly uses the pool context manager.Also applies to: 79-80, 94-134
cortex/hardware_detection.py (1)
196-196: Thread-safe cache I/O implementation looks good.The
_cache_lockusingthreading.RLock()correctly protects both_load_cacheand_save_cachemethods. Using RLock is appropriate here as it allows the same thread to re-acquire the lock if needed. The guard check forself.use_cachebefore the lock is a good optimization.Also applies to: 252-315
docs/PYTHON_314_COMPLETE_IMPLEMENTATION.md (1)
1-21: Comprehensive documentation for the thread-safety implementation.The executive summary and key achievements provide a clear overview of the work done. The phased approach and detailed test results are helpful for understanding the scope and validation of changes.
tests/test_thread_safety.py (2)
44-63: Test may produce false positives with the current singleton implementation.This test verifies that
get_detector()returns the same instance across threads. However, as noted in thehardware_detection.pyreview, theget_detector()function lacks thread-safe initialization. This test may pass due to the GIL in Python ≤3.13 but will likely fail under Python 3.14 free-threading (the stated target of this PR).Consider adding a note or skip condition, or ensure the singleton is fixed before these tests are relied upon for free-threading validation.
1-41: Comprehensive thread-safety test suite.The tests cover critical scenarios including singleton thread-safety, connection pool concurrent reads/writes, and stress testing. The use of
ThreadPoolExecutorwith high worker counts and the proper cleanup infinallyblocks are good practices.Also applies to: 66-182, 276-333
docs/PARALLEL_LLM_FREE_THREADING_DESIGN.md (2)
1-6: Well-structured design document for future implementation.The document clearly indicates it's a design document with "Implementation Pending" status. The architecture analysis, proposed improvements, and migration strategy are thorough and well-reasoned.
684-691: Robust free-threading detection logic.The detection uses multiple methods: checking
Py_GIL_DISABLEDconfig var and the runtimesys._is_gil_enabled()function. This provides good coverage for different Python 3.14+ builds and configurations.docs/PYTHON_314_THREAD_SAFETY_AUDIT.md (2)
1-30: Comprehensive thread-safety audit document.The audit correctly identifies critical issues including singleton races, unsafe SQLite usage, and file I/O without locks. The risk assessment matrix and phased implementation roadmap provide a clear path forward.
78-92: Audit accurately reflects the unfixedget_detector()issue.This section correctly identifies that
get_detector()inhardware_detection.pyhas a race condition. This aligns with the code review finding that this singleton is still not thread-safe despite other documentation claiming it's fixed.cortex/utils/db_pool.py (3)
19-96: Solid connection pool implementation with appropriate SQLite optimizations.The pool uses a queue-based design that's inherently thread-safe. The PRAGMA settings (WAL mode, NORMAL synchronous, 64MB cache, MEMORY temp store) are well-chosen for concurrent access scenarios. The
check_same_thread=Falsedefault is necessary for pool-based access across threads.
98-137: Well-implemented context manager with proper cleanup.The
get_connection()method correctly handles timeout with a descriptive error message, and always returns the connection to the pool in thefinallyblock. The overflow check (though it should never trigger) adds defensive logging.
181-222: Thread-safe singleton pattern correctly implemented.The
get_connection_pool()function uses double-checked locking properly: fast path without lock, then lock acquisition with re-check. This is the correct pattern for thread-safe lazy initialization.cortex/context_memory.py (4)
20-21: Correct migration to connection pooling.The import and initialization of the connection pool follow the established pattern. The database schema initialization correctly uses the pool context manager with proper commit.
Also applies to: 84-175
177-251: Database operations correctly use pool contexts.The
record_interactionandget_similar_interactionsmethods properly acquire connections from the pool and complete all database work within the context. The commit is correctly placed inside the context.
289-390: Pattern analysis and retrieval correctly use pooled connections.The
_analyze_patternsandget_patternsmethods properly use the connection pool. The INSERT ... ON CONFLICT pattern in_analyze_patternsis appropriate for the upsert operation.
510-673: Remaining database methods correctly migrated.All remaining methods (
_store_suggestion,get_active_suggestions,dismiss_suggestion,set_preference,get_preference,get_statistics,export_memory) properly use the connection pool with contexts that encompass all database operations before returning results.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
cortex/cli.pycortex/network_config.py
🚧 Files skipped from review as they are similar to previous changes (1)
- cortex/cli.py
🧰 Additional context used
📓 Path-based instructions (1)
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Follow PEP 8 style guide
Type hints required in Python code
Docstrings required for all public APIs
Files:
cortex/network_config.py
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: test (3.10)
- GitHub Check: test (3.12)
- GitHub Check: test (3.11)
🔇 Additional comments (8)
cortex/network_config.py (8)
1-24: LGTM!Module docstring, imports, and logger/console setup are well-organized and follow PEP 8 ordering (stdlib → third-party). The
getpassimport at module level addresses the previous review feedback.
38-67: Good implementation of lazy detection.The
auto_detectparameter with_detectedflag addresses the performance concerns raised in PR comments. Commands not requiring network can now passauto_detect=Falseand avoid the 2+ second startup delay.
68-94: LGTM!The
check_qualityparameter effectively addresses the performance concern about redundant network quality checks. Good use of early return pattern with_detectedflag.
222-253: LGTM!VPN detection logic is solid with good coverage of common VPN interface types. The empty
exceptclauses now have explanatory comments as previously requested.
349-363: LGTM!The pip proxy configuration now correctly handles both HTTP and HTTPS proxies with fallback, addressing the previous review feedback.
479-517: LGTM!The
auto_configuremethod provides good orchestration of the various configuration steps with appropriate handling for offline mode and connectivity failures.
586-613: LGTM!Good implementation with proper URL encoding for credentials and clear security warning in the docstring. The
noqa: S105 NOSONARcomment appropriately suppresses the false positive for the protocol prefix.
278-286: Bothhttps://8.8.8.8andhttps://1.1.1.1will fail with certificate errors.Neither Google's 8.8.8.8 nor Cloudflare's 1.1.1.1 serve TLS certificates valid for direct IP access. Google's certificate is issued for the
dns.googlehostname, and Cloudflare's certificates are issued forone.one.one.oneand other hostnames. Withverify=True(default), both IP-based endpoints will fail with SSL certificate name mismatch errors.Only
https://api.github.comin the list uses a hostname with a valid certificate and will succeed. Consider replacing both IP-based URLs with hostname-based endpoints or services specifically designed for DoH/DoT connectivity checks.Likely an incorrect or invalid review comment.
|
@copilot open a new pull request to apply changes based on the comments in this thread |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (1)
tests/test_network_config.py (1)
161-176: Fix mock_open pattern (issue persists from previous review).The trailing
()on line 172 is still present despite being marked as addressed in a previous review. Themock_open(read_data=apt_content)()pattern incorrectly calls the mock object. Remove the trailing parentheses:with patch("builtins.open") as mock_file: mock_file.side_effect = [ FileNotFoundError(), # proxy.conf doesn't exist - mock_open(read_data=apt_content)(), # apt.conf exists + mock_open(read_data=apt_content), # apt.conf exists ]This ensures the patched
openreturns a proper mock file handle when used as a context manager.Based on past review comments that marked this as addressed but the code still contains the issue.
🧹 Nitpick comments (1)
tests/test_network_config.py (1)
15-15: Remove unused pytest import.The
pytestimport is not used in this test file.🔎 Proposed fix
-import pytest import requestsBased on past review comments and code analysis.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
tests/test_network_config.py
🧰 Additional context used
📓 Path-based instructions (2)
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Follow PEP 8 style guide
Type hints required in Python code
Docstrings required for all public APIs
Files:
tests/test_network_config.py
tests/**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
Maintain >80% test coverage for pull requests
Files:
tests/test_network_config.py
🪛 GitHub Actions: CI
tests/test_network_config.py
[error] 607-607: Ruff check: W293 Blank line contains whitespace.
🪛 GitHub Check: lint
tests/test_network_config.py
[failure] 691-691: Ruff (W292)
tests/test_network_config.py:691:53: W292 No newline at end of file
[failure] 617-617: Ruff (W293)
tests/test_network_config.py:617:1: W293 Blank line contains whitespace
[failure] 607-607: Ruff (W293)
tests/test_network_config.py:607:1: W293 Blank line contains whitespace
🪛 GitHub Check: Lint
tests/test_network_config.py
[failure] 691-691: Ruff (W292)
tests/test_network_config.py:691:53: W292 No newline at end of file
[failure] 617-617: Ruff (W293)
tests/test_network_config.py:617:1: W293 Blank line contains whitespace
[failure] 607-607: Ruff (W293)
tests/test_network_config.py:607:1: W293 Blank line contains whitespace
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: test (3.11)
- GitHub Check: test (3.10)
- GitHub Check: test (3.12)
🔇 Additional comments (1)
tests/test_network_config.py (1)
1-691: Well-structured and comprehensive test suite.The test suite provides excellent coverage of the NetworkConfig module with 58 tests covering initialization, proxy/VPN detection, connectivity checks, configuration methods, caching, auto-configuration, helper functions, and integration scenarios. The tests follow best practices with proper mocking, isolation, descriptive names, and coverage of both success and failure paths.
- Use variables for test credentials to avoid hardcoded pattern - Apply Black and Ruff formatting - Fixes SonarQube S2068 security warning
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (3)
tests/test_network_config.py (3)
161-176: The mock_open pattern issue persists.Line 172 still contains
mock_open(read_data=apt_content)()with trailing parentheses, despite being marked as addressed in a previous review. Remove the trailing():🔎 Proposed fix
# First file doesn't exist, second has proxy with patch("builtins.open") as mock_file: mock_file.side_effect = [ FileNotFoundError(), # proxy.conf doesn't exist - mock_open(read_data=apt_content)(), # apt.conf exists + mock_open(read_data=apt_content).return_value, # apt.conf exists ] result = config._detect_system_proxy() assert result is not None assert result["http"] == "http://proxy:8080"Based on static analysis hints and pipeline failures.
601-620: Remove trailing whitespace from blank lines.Lines 607 and 617 contain trailing whitespace, violating PEP 8 and causing linter failures.
🔎 Proposed fix
test_pass = "pass" test_proxy = "http://proxy:8080" expected_url = f"http://{test_user}:{test_pass}@proxy:8080" - + result = add_proxy_auth(test_proxy, test_user, test_pass) assert result == expected_url def test_add_proxy_auth_no_protocol(self): """Test adding auth to proxy without protocol.""" test_user = "user" test_pass = "pass" test_proxy = "proxy:8080" expected_url = f"http://{test_user}:{test_pass}@proxy:8080" - + result = add_proxy_auth(test_proxy, test_user, test_pass) assert result == expected_urlBased on static analysis hints and pipeline failures.
690-691: Add newline at end of file.The file must end with a newline character per PEP 8 style guidelines.
🔎 Proposed fix
cached = config.get_cached_packages() assert cached == ["nginx", "docker"] +Based on static analysis hints and pipeline failures.
🧹 Nitpick comments (2)
tests/test_network_config.py (2)
50-55: Remove unused variable assignment.Line 54 assigns
configbut never uses it. Either use the variable in an assertion or remove the assignment.🔎 Proposed fix
def test_cache_dir_created(self): """Test cache directory is created on init.""" with patch.object(NetworkConfig, "detect"): with patch("pathlib.Path.mkdir") as mock_mkdir: - config = NetworkConfig() + NetworkConfig() mock_mkdir.assert_called_once_with(parents=True, exist_ok=True)
29-55: Consider usingauto_detect=Falseconsistently.Tests in
TestNetworkConfigInitusepatch.object(NetworkConfig, "detect")to prevent detection, but later test classes (lines 259, 270, 285, etc.) use the cleanerNetworkConfig(auto_detect=False)pattern. Consider refactoring for consistency.Example refactor
def test_init_default(self): """Test default initialization.""" - with patch.object(NetworkConfig, "detect"): - config = NetworkConfig() + config = NetworkConfig(auto_detect=False) - assert config.force_proxy is None - assert config.offline_mode is False - assert config.cache_dir == Path.home() / ".cortex" / "cache" + assert config.force_proxy is None + assert config.offline_mode is False + assert config.cache_dir == Path.home() / ".cortex" / "cache"
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
tests/test_network_config.py
🧰 Additional context used
📓 Path-based instructions (2)
**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
**/*.py: Follow PEP 8 style guide
Type hints required in Python code
Docstrings required for all public APIs
Files:
tests/test_network_config.py
tests/**/*.py
📄 CodeRabbit inference engine (AGENTS.md)
Maintain >80% test coverage for pull requests
Files:
tests/test_network_config.py
🧬 Code graph analysis (1)
tests/test_network_config.py (1)
cortex/network_config.py (17)
_detect_env_proxy(129-136)_detect_gnome_proxy(138-180)_detect_system_proxy(182-214)detect_proxy(97-127)_parse_proxy_url(216-218)detect_vpn(222-253)check_connectivity(257-289)detect_network_quality(291-307)configure_apt_proxy(311-347)configure_pip_proxy(349-362)get_httpx_proxy_config(364-384)cleanup_apt_proxy(460-477)cache_package_list(388-408)get_cached_packages(410-443)enable_offline_fallback(445-458)auto_configure(479-516)print_summary(520-538)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: Build Package
- GitHub Check: test (3.11)
- GitHub Check: test (3.10)
- GitHub Check: test (3.12)
🔇 Additional comments (1)
tests/test_network_config.py (1)
1-691: Comprehensive test suite with excellent coverage.The test suite demonstrates:
- Thorough coverage of NetworkConfig functionality (>80% as noted in PR objectives)
- Well-structured test classes organized by feature area
- Good edge case handling (missing files, permission errors, network failures, etc.)
- Appropriate mocking to isolate system dependencies
- Clear test names and docstrings for all test methods
The tests effectively validate the requirements from Issue #25 including proxy detection, VPN detection, connectivity checks, offline mode, and configuration methods.
However, please address the formatting issues (lines 607, 617, 691) and the mock_open pattern (line 172) flagged in other comments before merging.
…exlinux#25) (cortexlinux#340) * feat: Implement network configuration and proxy detection (Issue cortexlinux#25) - Add NetworkConfig class with auto-detection for proxies (HTTP/HTTPS/SOCKS) - Support proxy detection from env vars, GNOME settings, and system files - Implement VPN detection (OpenVPN, WireGuard, IPSec) - Add connectivity testing with DNS and HTTP fallback - Implement offline mode with package caching - Add proxy authentication helpers - Configure apt and pip for detected proxies - Add 58 comprehensive tests with >80% coverage - Add complete documentation for module and tests Resolves cortexlinux#25 * fix: Address code review feedback for network configuration Major fixes: - Add lazy loading support (auto_detect parameter) for faster CLI startup - Fix global socket timeout with proper context manager - URL-encode credentials in add_proxy_auth to handle special characters - Use separate HTTP/HTTPS proxy URLs in apt and pip configuration - Move getpass import to module level - Rename _detect_all to detect() as public API - Add ProtonVPN, NordVPN, Mullvad VPN detection support Minor fixes: - Remove redundant requests.Timeout exception - Fix trailing whitespace on blank lines - Add urllib.parse.quote import for URL encoding - Update all tests to use new detect() method name All 58 tests passing ✅ * [network_config] Update and fix tests, demo, and parallel LLM logic * [formatting] Apply code formatting and lint fixes * Add Python 3.14 free-threading compatibility - Comprehensive thread-safety audit and fixes for 15 modules - Added SQLite connection pooling infrastructure (db_pool.py) - Added locks for singletons and shared state - Created parallel LLM architecture design document (1,053 lines) - Added comprehensive thread-safety test suite - All 656 tests passing with stress testing verified - Documentation: 5 files totaling 15,000+ lines Thread-safety protection added to: - 3 singleton patterns (transaction_history, hardware_detection, graceful_degradation) - 7 database modules with connection pooling (semantic_cache, context_memory, etc.) - 5 modules with explicit locks (progress_indicators, config_manager, llm_router, etc.) Stress tested: 1,400+ threads, 4,950 operations, zero race conditions Fixes #273 * Update docs/PYTHON_314_THREAD_SAFETY_AUDIT.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update cortex/utils/db_pool.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix linting issues (ruff) - Fixed import sorting (I001) - Removed trailing whitespace (W291, W293) - Fixed f-string placeholders (F541) - Updated imports from collections.abc (UP035) All 656 tests still passing. No functional changes. * Apply Black formatting * Refactor system prompt in diagnose_errors_parallel and simplify connection pool timeout test * Replace random with secrets.SystemRandom for improved randomness in stress test * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: resolve 'SystemInfo' object has no attribute 'get' error in cortex demo - Access SystemInfo dataclass attributes directly instead of using .get() - Fix CPU info access: hw.cpu.model - Fix RAM info access: hw.memory.total_gb - Fix GPU info access: hw.gpu list with proper length check * Enhance free-threading detection and improve connection pool timeout test * perf: implement lazy loading for network detection - Add check_quality parameter to NetworkConfig.detect() method - Only detect network for commands that need it (install, doctor, stack, etc.) - Skip detection for fast commands (--version, --help) - Improves CLI startup time from 2.2s to 0.3s (87% faster) Addresses performance feedback from maintainers * style: fix whitespace linting errors * style: apply black formatting * Fix SonarQube security warning by using variables for test credentials * Fix SonarQube security warning and apply code formatting - Use variables for test credentials to avoid hardcoded pattern - Apply Black and Ruff formatting - Fixes SonarQube S2068 security warning --------- Co-authored-by: Shree <shreemj0407@example.com> Co-authored-by: sujay-d07 <sujaydongre07@gmail.com> Co-authored-by: Sujay <163128998+sujay-d07@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Jay Surse <jay@cortex.local>
…exlinux#25) (cortexlinux#340) * feat: Implement network configuration and proxy detection (Issue cortexlinux#25) - Add NetworkConfig class with auto-detection for proxies (HTTP/HTTPS/SOCKS) - Support proxy detection from env vars, GNOME settings, and system files - Implement VPN detection (OpenVPN, WireGuard, IPSec) - Add connectivity testing with DNS and HTTP fallback - Implement offline mode with package caching - Add proxy authentication helpers - Configure apt and pip for detected proxies - Add 58 comprehensive tests with >80% coverage - Add complete documentation for module and tests Resolves cortexlinux#25 * fix: Address code review feedback for network configuration Major fixes: - Add lazy loading support (auto_detect parameter) for faster CLI startup - Fix global socket timeout with proper context manager - URL-encode credentials in add_proxy_auth to handle special characters - Use separate HTTP/HTTPS proxy URLs in apt and pip configuration - Move getpass import to module level - Rename _detect_all to detect() as public API - Add ProtonVPN, NordVPN, Mullvad VPN detection support Minor fixes: - Remove redundant requests.Timeout exception - Fix trailing whitespace on blank lines - Add urllib.parse.quote import for URL encoding - Update all tests to use new detect() method name All 58 tests passing ✅ * [network_config] Update and fix tests, demo, and parallel LLM logic * [formatting] Apply code formatting and lint fixes * Add Python 3.14 free-threading compatibility - Comprehensive thread-safety audit and fixes for 15 modules - Added SQLite connection pooling infrastructure (db_pool.py) - Added locks for singletons and shared state - Created parallel LLM architecture design document (1,053 lines) - Added comprehensive thread-safety test suite - All 656 tests passing with stress testing verified - Documentation: 5 files totaling 15,000+ lines Thread-safety protection added to: - 3 singleton patterns (transaction_history, hardware_detection, graceful_degradation) - 7 database modules with connection pooling (semantic_cache, context_memory, etc.) - 5 modules with explicit locks (progress_indicators, config_manager, llm_router, etc.) Stress tested: 1,400+ threads, 4,950 operations, zero race conditions Fixes #273 * Update docs/PYTHON_314_THREAD_SAFETY_AUDIT.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update cortex/utils/db_pool.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix linting issues (ruff) - Fixed import sorting (I001) - Removed trailing whitespace (W291, W293) - Fixed f-string placeholders (F541) - Updated imports from collections.abc (UP035) All 656 tests still passing. No functional changes. * Apply Black formatting * Refactor system prompt in diagnose_errors_parallel and simplify connection pool timeout test * Replace random with secrets.SystemRandom for improved randomness in stress test * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: resolve 'SystemInfo' object has no attribute 'get' error in cortex demo - Access SystemInfo dataclass attributes directly instead of using .get() - Fix CPU info access: hw.cpu.model - Fix RAM info access: hw.memory.total_gb - Fix GPU info access: hw.gpu list with proper length check * Enhance free-threading detection and improve connection pool timeout test * perf: implement lazy loading for network detection - Add check_quality parameter to NetworkConfig.detect() method - Only detect network for commands that need it (install, doctor, stack, etc.) - Skip detection for fast commands (--version, --help) - Improves CLI startup time from 2.2s to 0.3s (87% faster) Addresses performance feedback from maintainers * style: fix whitespace linting errors * style: apply black formatting * Fix SonarQube security warning by using variables for test credentials * Fix SonarQube security warning and apply code formatting - Use variables for test credentials to avoid hardcoded pattern - Apply Black and Ruff formatting - Fixes SonarQube S2068 security warning --------- Co-authored-by: Shree <shreemj0407@example.com> Co-authored-by: sujay-d07 <sujaydongre07@gmail.com> Co-authored-by: Sujay <163128998+sujay-d07@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Jay Surse <jay@cortex.local>
…exlinux#25) (cortexlinux#340) * feat: Implement network configuration and proxy detection (Issue cortexlinux#25) - Add NetworkConfig class with auto-detection for proxies (HTTP/HTTPS/SOCKS) - Support proxy detection from env vars, GNOME settings, and system files - Implement VPN detection (OpenVPN, WireGuard, IPSec) - Add connectivity testing with DNS and HTTP fallback - Implement offline mode with package caching - Add proxy authentication helpers - Configure apt and pip for detected proxies - Add 58 comprehensive tests with >80% coverage - Add complete documentation for module and tests Resolves cortexlinux#25 * fix: Address code review feedback for network configuration Major fixes: - Add lazy loading support (auto_detect parameter) for faster CLI startup - Fix global socket timeout with proper context manager - URL-encode credentials in add_proxy_auth to handle special characters - Use separate HTTP/HTTPS proxy URLs in apt and pip configuration - Move getpass import to module level - Rename _detect_all to detect() as public API - Add ProtonVPN, NordVPN, Mullvad VPN detection support Minor fixes: - Remove redundant requests.Timeout exception - Fix trailing whitespace on blank lines - Add urllib.parse.quote import for URL encoding - Update all tests to use new detect() method name All 58 tests passing ✅ * [network_config] Update and fix tests, demo, and parallel LLM logic * [formatting] Apply code formatting and lint fixes * Add Python 3.14 free-threading compatibility - Comprehensive thread-safety audit and fixes for 15 modules - Added SQLite connection pooling infrastructure (db_pool.py) - Added locks for singletons and shared state - Created parallel LLM architecture design document (1,053 lines) - Added comprehensive thread-safety test suite - All 656 tests passing with stress testing verified - Documentation: 5 files totaling 15,000+ lines Thread-safety protection added to: - 3 singleton patterns (transaction_history, hardware_detection, graceful_degradation) - 7 database modules with connection pooling (semantic_cache, context_memory, etc.) - 5 modules with explicit locks (progress_indicators, config_manager, llm_router, etc.) Stress tested: 1,400+ threads, 4,950 operations, zero race conditions Fixes #273 * Update docs/PYTHON_314_THREAD_SAFETY_AUDIT.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update cortex/utils/db_pool.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix linting issues (ruff) - Fixed import sorting (I001) - Removed trailing whitespace (W291, W293) - Fixed f-string placeholders (F541) - Updated imports from collections.abc (UP035) All 656 tests still passing. No functional changes. * Apply Black formatting * Refactor system prompt in diagnose_errors_parallel and simplify connection pool timeout test * Replace random with secrets.SystemRandom for improved randomness in stress test * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: resolve 'SystemInfo' object has no attribute 'get' error in cortex demo - Access SystemInfo dataclass attributes directly instead of using .get() - Fix CPU info access: hw.cpu.model - Fix RAM info access: hw.memory.total_gb - Fix GPU info access: hw.gpu list with proper length check * Enhance free-threading detection and improve connection pool timeout test * perf: implement lazy loading for network detection - Add check_quality parameter to NetworkConfig.detect() method - Only detect network for commands that need it (install, doctor, stack, etc.) - Skip detection for fast commands (--version, --help) - Improves CLI startup time from 2.2s to 0.3s (87% faster) Addresses performance feedback from maintainers * style: fix whitespace linting errors * style: apply black formatting * Fix SonarQube security warning by using variables for test credentials * Fix SonarQube security warning and apply code formatting - Use variables for test credentials to avoid hardcoded pattern - Apply Black and Ruff formatting - Fixes SonarQube S2068 security warning --------- Co-authored-by: Shree <shreemj0407@example.com> Co-authored-by: sujay-d07 <sujaydongre07@gmail.com> Co-authored-by: Sujay <163128998+sujay-d07@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Jay Surse <jay@cortex.local>
…exlinux#25) (cortexlinux#340) * feat: Implement network configuration and proxy detection (Issue cortexlinux#25) - Add NetworkConfig class with auto-detection for proxies (HTTP/HTTPS/SOCKS) - Support proxy detection from env vars, GNOME settings, and system files - Implement VPN detection (OpenVPN, WireGuard, IPSec) - Add connectivity testing with DNS and HTTP fallback - Implement offline mode with package caching - Add proxy authentication helpers - Configure apt and pip for detected proxies - Add 58 comprehensive tests with >80% coverage - Add complete documentation for module and tests Resolves cortexlinux#25 * fix: Address code review feedback for network configuration Major fixes: - Add lazy loading support (auto_detect parameter) for faster CLI startup - Fix global socket timeout with proper context manager - URL-encode credentials in add_proxy_auth to handle special characters - Use separate HTTP/HTTPS proxy URLs in apt and pip configuration - Move getpass import to module level - Rename _detect_all to detect() as public API - Add ProtonVPN, NordVPN, Mullvad VPN detection support Minor fixes: - Remove redundant requests.Timeout exception - Fix trailing whitespace on blank lines - Add urllib.parse.quote import for URL encoding - Update all tests to use new detect() method name All 58 tests passing ✅ * [network_config] Update and fix tests, demo, and parallel LLM logic * [formatting] Apply code formatting and lint fixes * Add Python 3.14 free-threading compatibility - Comprehensive thread-safety audit and fixes for 15 modules - Added SQLite connection pooling infrastructure (db_pool.py) - Added locks for singletons and shared state - Created parallel LLM architecture design document (1,053 lines) - Added comprehensive thread-safety test suite - All 656 tests passing with stress testing verified - Documentation: 5 files totaling 15,000+ lines Thread-safety protection added to: - 3 singleton patterns (transaction_history, hardware_detection, graceful_degradation) - 7 database modules with connection pooling (semantic_cache, context_memory, etc.) - 5 modules with explicit locks (progress_indicators, config_manager, llm_router, etc.) Stress tested: 1,400+ threads, 4,950 operations, zero race conditions Fixes #273 * Update docs/PYTHON_314_THREAD_SAFETY_AUDIT.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update cortex/utils/db_pool.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix linting issues (ruff) - Fixed import sorting (I001) - Removed trailing whitespace (W291, W293) - Fixed f-string placeholders (F541) - Updated imports from collections.abc (UP035) All 656 tests still passing. No functional changes. * Apply Black formatting * Refactor system prompt in diagnose_errors_parallel and simplify connection pool timeout test * Replace random with secrets.SystemRandom for improved randomness in stress test * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tests/test_thread_safety.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: resolve 'SystemInfo' object has no attribute 'get' error in cortex demo - Access SystemInfo dataclass attributes directly instead of using .get() - Fix CPU info access: hw.cpu.model - Fix RAM info access: hw.memory.total_gb - Fix GPU info access: hw.gpu list with proper length check * Enhance free-threading detection and improve connection pool timeout test * perf: implement lazy loading for network detection - Add check_quality parameter to NetworkConfig.detect() method - Only detect network for commands that need it (install, doctor, stack, etc.) - Skip detection for fast commands (--version, --help) - Improves CLI startup time from 2.2s to 0.3s (87% faster) Addresses performance feedback from maintainers * style: fix whitespace linting errors * style: apply black formatting * Fix SonarQube security warning by using variables for test credentials * Fix SonarQube security warning and apply code formatting - Use variables for test credentials to avoid hardcoded pattern - Apply Black and Ruff formatting - Fixes SonarQube S2068 security warning --------- Co-authored-by: Shree <shreemj0407@example.com> Co-authored-by: sujay-d07 <sujaydongre07@gmail.com> Co-authored-by: Sujay <163128998+sujay-d07@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Jay Surse <jay@cortex.local>


Changes
Resolves #25
Related Issue
Closes #25
Summary
This PR implements comprehensive network configuration and proxy detection for Cortex Linux, enabling seamless operation behind corporate firewalls and in various network environments. The implementation automatically detects system proxy settings from multiple sources (environment variables, GNOME settings, system files), handles VPN connections, supports proxy authentication, and provides graceful offline fallback with package caching. All functionality is thoroughly tested with 58 test cases achieving >80% code coverage and includes complete documentation.
Checklist
pytest tests/)[feat] Network configuration and proxy detectionSummary by CodeRabbit
New Features
Improvements
Documentation
Tests
✏️ Tip: You can customize this high-level summary in your review settings.
Screencast.from.22-12-25.06.35.37.PM.IST.webm