fixos 2.2.47__tar.gz → 2.2.49__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fixos-2.2.47 → fixos-2.2.49}/CHANGELOG.md +70 -0
- {fixos-2.2.47 → fixos-2.2.49}/MANIFEST.in +1 -0
- {fixos-2.2.47 → fixos-2.2.49}/PKG-INFO +6 -6
- {fixos-2.2.47 → fixos-2.2.49}/README.md +5 -4
- {fixos-2.2.47 → fixos-2.2.49}/docker/debian/Dockerfile +1 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/fedora/Dockerfile +1 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/ubuntu/Dockerfile +1 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/__init__.py +1 -1
- {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/autonomous_session.py +29 -23
- fixos-2.2.49/fixos/agent/hitl_session.py +386 -0
- fixos-2.2.49/fixos/agent/session_core.py +781 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/session_handlers.py +253 -16
- {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/session_io.py +127 -18
- fixos-2.2.49/fixos/anonymizer.py +18 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/_cleanup_flatpak.py +5 -1
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/_cleanup_utils.py +15 -2
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/ask_cmd.py +256 -55
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/cleanup_cmd.py +742 -35
- fixos-2.2.49/fixos/cli/jetbrains_cmd.py +358 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/main.py +79 -20
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/quick_cmd.py +10 -12
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/shared.py +86 -3
- fixos-2.2.49/fixos/cli/shell_cmd.py +220 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/config.py +105 -11
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_storage_system_mixin.py +62 -17
- fixos-2.2.49/fixos/diagnostics/docker_startup_optimizer.py +560 -0
- fixos-2.2.49/fixos/diagnostics/jetbrains_ai.py +294 -0
- fixos-2.2.49/fixos/diagnostics/jetbrains_recovery.py +638 -0
- fixos-2.2.49/fixos/diagnostics/orphaned_workloads.py +731 -0
- fixos-2.2.49/fixos/diagnostics/process_chains.py +594 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/quick_snapshot.py +36 -18
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/service_cleanup.py +267 -64
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/service_scanner.py +99 -38
- fixos-2.2.49/fixos/endpoint_refresh.py +200 -0
- fixos-2.2.49/fixos/features/data/packages.yaml +316 -0
- fixos-2.2.49/fixos/features/data/profiles/developer.yaml +13 -0
- fixos-2.2.49/fixos/features/data/profiles/office.yaml +9 -0
- fixos-2.2.49/fixos/features/data/profiles/sysadmin.yaml +13 -0
- fixos-2.2.49/fixos/orphan_pins.py +155 -0
- fixos-2.2.49/fixos/profiles/desktop.yaml +12 -0
- fixos-2.2.49/fixos/profiles/developer.yaml +10 -0
- fixos-2.2.49/fixos/profiles/minimal.yaml +5 -0
- fixos-2.2.49/fixos/profiles/server.yaml +11 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/providers/llm.py +66 -23
- fixos-2.2.49/fixos/utils/anonymizer.py +560 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/PKG-INFO +6 -6
- {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/SOURCES.txt +32 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/requires.txt +0 -3
- {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/top_level.txt +0 -3
- {fixos-2.2.47 → fixos-2.2.49}/pyproject.toml +22 -19
- {fixos-2.2.47 → fixos-2.2.49}/pytest.ini +2 -1
- {fixos-2.2.47 → fixos-2.2.49}/setup.py +1 -1
- {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_anonymization_layers.py +39 -16
- {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_audio_broken.py +4 -2
- {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_multi_system.py +6 -1
- fixos-2.2.49/tests/unit/test_anonymizer.py +390 -0
- fixos-2.2.49/tests/unit/test_ask_and_nl_group.py +278 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_cleanup_cmd.py +248 -4
- fixos-2.2.49/tests/unit/test_cleanup_effectiveness.py +177 -0
- fixos-2.2.49/tests/unit/test_cleanup_safety.py +353 -0
- fixos-2.2.49/tests/unit/test_cleanup_utils.py +79 -0
- fixos-2.2.49/tests/unit/test_core.py +1098 -0
- fixos-2.2.49/tests/unit/test_docker_startup_optimizer.py +369 -0
- fixos-2.2.49/tests/unit/test_endpoint_refresh.py +169 -0
- fixos-2.2.49/tests/unit/test_jetbrains_cmd.py +293 -0
- fixos-2.2.49/tests/unit/test_jetbrains_recovery.py +383 -0
- fixos-2.2.49/tests/unit/test_llm_auth_stop.py +160 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_llm_provider.py +70 -0
- fixos-2.2.49/tests/unit/test_orphan_pins.py +137 -0
- fixos-2.2.49/tests/unit/test_orphaned_workloads.py +306 -0
- fixos-2.2.49/tests/unit/test_packaging_data.py +57 -0
- fixos-2.2.49/tests/unit/test_process_chains.py +300 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_quick_cmd.py +22 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_quick_snapshot.py +30 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_service_cleanup.py +16 -9
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_service_scanner.py +19 -11
- fixos-2.2.49/tests/unit/test_shell_ux.py +98 -0
- fixos-2.2.49/tests/unit/test_storage_analyzer.py +72 -0
- fixos-2.2.47/fixos/agent/hitl_session.py +0 -246
- fixos-2.2.47/fixos/agent/session_core.py +0 -245
- fixos-2.2.47/fixos/anonymizer.py +0 -80
- fixos-2.2.47/fixos/utils/anonymizer.py +0 -356
- fixos-2.2.47/tests/unit/test_anonymizer.py +0 -198
- fixos-2.2.47/tests/unit/test_core.py +0 -385
- {fixos-2.2.47 → fixos-2.2.49}/.env.example +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/LICENSE +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/README.md +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/TEST_RESULTS.md +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/TEST_RESULTS_V2.md +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/alpine/Dockerfile +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/arch/Dockerfile +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/base/Dockerfile +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/broken-audio/Dockerfile +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/broken-full/Dockerfile +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/broken-network/Dockerfile +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/broken-thumbnails/Dockerfile +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/docker-compose.multi-system.yml +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/docker-compose.yml +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/test-multi-system.sh +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/test-scenarios.sh +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docker/validate-scenario.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docs/examples/advanced_usage.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/docs/examples/quickstart.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/__main__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/autonomous.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/hitl.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/_cleanup_home.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/_cleanup_snap.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/_cleanup_system.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/config_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/features_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/fix_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/history_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/orchestrate_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/output_formatter.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/profile_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/projects_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/provider_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/quickfix_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/report_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/rollback_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/scan_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/token_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/watch_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/cli.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/config_interactive.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/constants.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_flatpak_analysis_mixin.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_flatpak_execution_mixin.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_flatpak_recommendations_mixin.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_storage_container_mixin.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_storage_user_mixin.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/cache_discovery.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/_shared.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/audio.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/file_analysis.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/hardware.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/packages.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/resources.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/security.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/storage_optimization.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/system_core.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/thumbnails.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/dev_project_analyzer.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/disk_analyzer.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/docker_network_cleanup.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/flatpak_analyzer.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/project_scanner.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/service_details.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/storage_analyzer.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/system_checks.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/utils.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/features/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/features/auditor.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/features/catalog.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/features/installer.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/features/profiles.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/features/renderer.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/fixes/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/interactive/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/interactive/cleanup_planner.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/llm_shell.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/orchestrator/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/orchestrator/executor.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/orchestrator/graph.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/orchestrator/orchestrator.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/orchestrator/rollback.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/platform_utils.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/base.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/audio.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/disk.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/hardware.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/resources.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/security.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/thumbnails.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/registry.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/profiles/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/providers/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/providers/llm_analyzer.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/providers/schemas.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/system_checks.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/utils/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/utils/terminal.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/utils/timeout.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/utils/web_search.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos/watch.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/dependency_links.txt +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/entry_points.txt +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/requirements-dev.txt +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/requirements.txt +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/scripts/pyqual-calibrate.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/setup.cfg +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/conftest.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_cli.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_diagnostics_integration.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_executor.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_network_broken.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_thumbnails_broken.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/test_fixos.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/__init__.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_cache_discovery.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_dev_project_analyzer.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_docker_network_cleanup.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_executor.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_orchestrator.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_project_scanner.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_projects_cmd.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_resources_quick.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_security_quick.py +0 -0
- {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_system_checks_parallel.py +0 -0
|
@@ -80,6 +80,76 @@
|
|
|
80
80
|
rekurencyjnych skanów `/` oraz `/home` z szybkich kontroli.
|
|
81
81
|
- Czyszczenie cache JetBrains trafia w aktualną ścieżkę i wymaga zamknięcia IDE.
|
|
82
82
|
|
|
83
|
+
## [2.2.48] - 2026-09-12
|
|
84
|
+
|
|
85
|
+
### Docs
|
|
86
|
+
- Update TODO.md
|
|
87
|
+
- Update docs/autonomy-status.md
|
|
88
|
+
- Update docs/registry-integration.md
|
|
89
|
+
- Update project/TICKETS.md
|
|
90
|
+
- Update project/ticket-018/README.md
|
|
91
|
+
- Update project/ticket-018/ai-codex.md
|
|
92
|
+
- Update project/ticket-018/changelog.md
|
|
93
|
+
- Update project/ticket-018/preprompt.md
|
|
94
|
+
- Update project/ticket-020/README.md
|
|
95
|
+
- Update project/ticket-020/ai-codex.md
|
|
96
|
+
- ... and 2 more files
|
|
97
|
+
|
|
98
|
+
### Test
|
|
99
|
+
- Update tests/unit/test_ask_and_nl_group.py
|
|
100
|
+
|
|
101
|
+
### Other
|
|
102
|
+
- Update fixos/cli/ask_cmd.py
|
|
103
|
+
- Update fixos/cli/main.py
|
|
104
|
+
- Update fixos/cli/shared.py
|
|
105
|
+
- Update fixos/cli/shell_cmd.py
|
|
106
|
+
- Update project/ticket-018/ai-codex-logs.txt
|
|
107
|
+
- Update project/ticket-018/intent.json
|
|
108
|
+
- Update project/ticket-020/ai-codex-logs.txt
|
|
109
|
+
- Update project/ticket-020/intent.json
|
|
110
|
+
|
|
111
|
+
## [2.2.48] - 2026-09-01
|
|
112
|
+
|
|
113
|
+
### Docs
|
|
114
|
+
- Update TODO.md
|
|
115
|
+
- Update project/TICKETS.md
|
|
116
|
+
- Update project/ticket-013/README.md
|
|
117
|
+
- Update project/ticket-013/ai-codex.md
|
|
118
|
+
- Update project/ticket-013/changelog.md
|
|
119
|
+
- Update project/ticket-013/preprompt.md
|
|
120
|
+
|
|
121
|
+
### Test
|
|
122
|
+
- Update tests/unit/test_core.py
|
|
123
|
+
|
|
124
|
+
### Other
|
|
125
|
+
- Update fixos/agent/hitl_session.py
|
|
126
|
+
- Update fixos/agent/session_io.py
|
|
127
|
+
- Update project/ticket-013/ai-codex-logs.txt
|
|
128
|
+
- Update project/ticket-013/intent.json
|
|
129
|
+
- Update project/planfile-tickets.yaml
|
|
130
|
+
|
|
131
|
+
## [2.2.48] - 2026-09-01
|
|
132
|
+
|
|
133
|
+
### Docs
|
|
134
|
+
- Update TODO.md
|
|
135
|
+
- Update project/TICKETS.md
|
|
136
|
+
- Update project/ticket-012/README.md
|
|
137
|
+
- Update project/ticket-012/ai-codex.md
|
|
138
|
+
- Update project/ticket-012/changelog.md
|
|
139
|
+
- Update project/ticket-012/preprompt.md
|
|
140
|
+
|
|
141
|
+
### Test
|
|
142
|
+
- Update tests/unit/test_core.py
|
|
143
|
+
|
|
144
|
+
### Other
|
|
145
|
+
- Update fixos/agent/hitl_session.py
|
|
146
|
+
- Update fixos/agent/session_core.py
|
|
147
|
+
- Update fixos/agent/session_handlers.py
|
|
148
|
+
- Update fixos/agent/session_io.py
|
|
149
|
+
- Update project/ticket-012/ai-codex-logs.txt
|
|
150
|
+
- Update project/ticket-012/intent.json
|
|
151
|
+
- Update project/planfile-tickets.yaml
|
|
152
|
+
|
|
83
153
|
## [2.2.47] - 2026-08-13
|
|
84
154
|
|
|
85
155
|
### Docs
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fixos
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.49
|
|
4
4
|
Summary: AI-powered Linux/Windows diagnostics and repair – audio, hardware, system issues
|
|
5
5
|
Home-page: https://github.com/wronai/fixos
|
|
6
6
|
Author: fixos contributors
|
|
@@ -37,11 +37,11 @@ Requires-Dist: pytest-timeout>=2.2.0; extra == "dev"
|
|
|
37
37
|
Requires-Dist: pytest-sugar>=0.9.7; extra == "dev"
|
|
38
38
|
Requires-Dist: goal>=2.1.0; python_version >= "3.12" and extra == "dev"
|
|
39
39
|
Requires-Dist: costs>=0.1.20; extra == "dev"
|
|
40
|
-
Requires-Dist: pfix>=0.1.60; python_version >= "3.10" and extra == "dev"
|
|
41
40
|
Dynamic: home-page
|
|
42
41
|
Dynamic: license-file
|
|
43
42
|
Dynamic: requires-python
|
|
44
43
|
|
|
44
|
+

|
|
45
45
|
```
|
|
46
46
|
___ _ ___ ____
|
|
47
47
|
/ _(_)_ __ / _ \/ ___|
|
|
@@ -63,11 +63,11 @@ AI-powered OS Diagnostics
|
|
|
63
63
|
|
|
64
64
|
## AI Cost Tracking
|
|
65
65
|
|
|
66
|
-
    
|
|
67
|
+
  
|
|
68
68
|
|
|
69
|
-
- 🤖 **LLM usage:** $4.
|
|
70
|
-
- 👤 **Human dev:** ~$
|
|
69
|
+
- 🤖 **LLM usage:** $4.9010 (154 commits)
|
|
70
|
+
- 👤 **Human dev:** ~$4216 (42.2h @ $100/h, 30min dedup)
|
|
71
71
|
|
|
72
72
|
Generated on 2026-08-13 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
|
|
73
73
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+

|
|
1
2
|
```
|
|
2
3
|
___ _ ___ ____
|
|
3
4
|
/ _(_)_ __ / _ \/ ___|
|
|
@@ -19,11 +20,11 @@ AI-powered OS Diagnostics
|
|
|
19
20
|
|
|
20
21
|
## AI Cost Tracking
|
|
21
22
|
|
|
22
|
-
    
|
|
24
|
+
  
|
|
24
25
|
|
|
25
|
-
- 🤖 **LLM usage:** $4.
|
|
26
|
-
- 👤 **Human dev:** ~$
|
|
26
|
+
- 🤖 **LLM usage:** $4.9010 (154 commits)
|
|
27
|
+
- 👤 **Human dev:** ~$4216 (42.2h @ $100/h, 30min dedup)
|
|
27
28
|
|
|
28
29
|
Generated on 2026-08-13 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
|
|
29
30
|
|
|
@@ -8,22 +8,21 @@ import signal
|
|
|
8
8
|
import subprocess
|
|
9
9
|
import time
|
|
10
10
|
from dataclasses import dataclass, field
|
|
11
|
-
from typing import
|
|
11
|
+
from typing import Any
|
|
12
12
|
|
|
13
|
-
from ..providers.llm import LLMClient, LLMError
|
|
14
|
-
from ..utils.anonymizer import anonymize, deanonymize, display_anonymized_preview
|
|
15
|
-
from ..utils.web_search import search_all, format_results_for_llm
|
|
16
13
|
from ..config import FixOsConfig
|
|
17
|
-
from ..utils.timeout import SessionTimeout
|
|
18
14
|
from ..constants import (
|
|
19
|
-
UI_BORDER_WIDTH,
|
|
20
|
-
MAX_OUTPUT_PREVIEW_LENGTH,
|
|
21
15
|
DEFAULT_COMMAND_TIMEOUT,
|
|
22
16
|
DEFAULT_TOKEN_LIMIT,
|
|
23
17
|
MAX_COMMAND_LENGTH,
|
|
18
|
+
MAX_OUTPUT_PREVIEW_LENGTH,
|
|
24
19
|
MAX_SEARCH_QUERY_LENGTH,
|
|
20
|
+
UI_BORDER_WIDTH,
|
|
25
21
|
)
|
|
26
|
-
|
|
22
|
+
from ..providers.llm import LLMAuthError, LLMClient, LLMError
|
|
23
|
+
from ..utils.anonymizer import anonymize, deanonymize, display_anonymized_preview
|
|
24
|
+
from ..utils.timeout import SessionTimeout
|
|
25
|
+
from ..utils.web_search import format_results_for_llm, search_all
|
|
27
26
|
|
|
28
27
|
# Commands NEVER executed automatically
|
|
29
28
|
FORBIDDEN_COMMANDS = [
|
|
@@ -81,8 +80,8 @@ Zasady:
|
|
|
81
80
|
class FixAction:
|
|
82
81
|
command: str
|
|
83
82
|
reason: str
|
|
84
|
-
result:
|
|
85
|
-
success:
|
|
83
|
+
result: str | None = None
|
|
84
|
+
success: bool | None = None
|
|
86
85
|
timestamp: float = field(default_factory=time.time)
|
|
87
86
|
|
|
88
87
|
|
|
@@ -117,7 +116,7 @@ class AutonomousSession:
|
|
|
117
116
|
|
|
118
117
|
def __init__(
|
|
119
118
|
self,
|
|
120
|
-
diagnostics:
|
|
119
|
+
diagnostics: dict[str, Any],
|
|
121
120
|
config: FixOsConfig,
|
|
122
121
|
show_data: bool = True,
|
|
123
122
|
max_fixes: int = 10,
|
|
@@ -130,7 +129,7 @@ class AutonomousSession:
|
|
|
130
129
|
self.report = AgentReport()
|
|
131
130
|
self.fix_count = 0
|
|
132
131
|
self.search_count = 0
|
|
133
|
-
self.messages:
|
|
132
|
+
self.messages: list[dict[str, str]] = []
|
|
134
133
|
self.start_time = time.time()
|
|
135
134
|
self._setup_timeout()
|
|
136
135
|
|
|
@@ -193,12 +192,17 @@ class AutonomousSession:
|
|
|
193
192
|
if self._get_remaining_time() <= 0:
|
|
194
193
|
raise SessionTimeout()
|
|
195
194
|
|
|
196
|
-
def _query_llm(self) ->
|
|
195
|
+
def _query_llm(self) -> str | None:
|
|
197
196
|
"""Query LLM and return reply."""
|
|
198
197
|
try:
|
|
199
198
|
return self.llm.chat(
|
|
200
199
|
self.messages, max_tokens=DEFAULT_TOKEN_LIMIT, temperature=0.1
|
|
201
200
|
)
|
|
201
|
+
except LLMAuthError as e:
|
|
202
|
+
print(f" ❌ LLM błąd: {e}")
|
|
203
|
+
print(" Sesja zakończona: popraw klucz API i uruchom ponownie.")
|
|
204
|
+
self.llm_auth_failed = True
|
|
205
|
+
return None
|
|
202
206
|
except LLMError as e:
|
|
203
207
|
print(f" ❌ LLM błąd: {e}")
|
|
204
208
|
return None
|
|
@@ -215,7 +219,7 @@ class AutonomousSession:
|
|
|
215
219
|
return True
|
|
216
220
|
return False
|
|
217
221
|
|
|
218
|
-
def _parse_action(self, reply: str) ->
|
|
222
|
+
def _parse_action(self, reply: str) -> dict[str, Any] | None:
|
|
219
223
|
"""Parse JSON action from LLM reply."""
|
|
220
224
|
import json
|
|
221
225
|
|
|
@@ -235,7 +239,7 @@ class AutonomousSession:
|
|
|
235
239
|
except json.JSONDecodeError:
|
|
236
240
|
return None
|
|
237
241
|
|
|
238
|
-
def _is_forbidden(self, cmd: str) ->
|
|
242
|
+
def _is_forbidden(self, cmd: str) -> str | None:
|
|
239
243
|
"""Check if command is forbidden."""
|
|
240
244
|
for pattern in FORBIDDEN_COMMANDS:
|
|
241
245
|
if re.search(pattern, cmd, re.IGNORECASE):
|
|
@@ -260,15 +264,16 @@ class AutonomousSession:
|
|
|
260
264
|
capture_output=True,
|
|
261
265
|
text=True,
|
|
262
266
|
timeout=DEFAULT_COMMAND_TIMEOUT,
|
|
267
|
+
check=False,
|
|
263
268
|
)
|
|
264
269
|
out = proc.stdout.strip() or proc.stderr.strip() or "(brak outputu)"
|
|
265
270
|
return proc.returncode == 0, out[:MAX_OUTPUT_PREVIEW_LENGTH]
|
|
266
271
|
except subprocess.TimeoutExpired:
|
|
267
272
|
return False, f"[TIMEOUT {DEFAULT_COMMAND_TIMEOUT}s]"
|
|
268
|
-
except Exception as e:
|
|
273
|
+
except Exception as e: # noqa: BLE001 - report any command failure to the LLM loop
|
|
269
274
|
return False, f"[WYJĄTEK: {e}]"
|
|
270
275
|
|
|
271
|
-
def _handle_search(self, action_data:
|
|
276
|
+
def _handle_search(self, action_data: dict[str, Any]) -> bool:
|
|
272
277
|
"""Handle SEARCH action - perform web search."""
|
|
273
278
|
query = action_data.get("search_query", "fedora fix")
|
|
274
279
|
if self.search_count < self.MAX_SEARCHES:
|
|
@@ -301,7 +306,7 @@ class AutonomousSession:
|
|
|
301
306
|
)
|
|
302
307
|
return False
|
|
303
308
|
|
|
304
|
-
def _handle_exec(self, action_data:
|
|
309
|
+
def _handle_exec(self, action_data: dict[str, Any]) -> bool:
|
|
305
310
|
"""Handle EXEC action - execute command."""
|
|
306
311
|
cmd_raw = action_data.get("command", "").strip()
|
|
307
312
|
reason = action_data.get("reason", "")
|
|
@@ -353,7 +358,7 @@ class AutonomousSession:
|
|
|
353
358
|
)
|
|
354
359
|
return True
|
|
355
360
|
|
|
356
|
-
def _handle_skip(self, action_data:
|
|
361
|
+
def _handle_skip(self, action_data: dict[str, Any]) -> None:
|
|
357
362
|
"""Handle SKIP action."""
|
|
358
363
|
reason = action_data.get("reason", "")
|
|
359
364
|
print(f" ⏭️ Pomijam: {reason}")
|
|
@@ -380,9 +385,10 @@ class AutonomousSession:
|
|
|
380
385
|
# Query LLM
|
|
381
386
|
reply = self._query_llm()
|
|
382
387
|
if reply is None:
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
388
|
+
# Retrying a rejected key only repeats the failure.
|
|
389
|
+
return not getattr(
|
|
390
|
+
self, "llm_auth_failed", False
|
|
391
|
+
) and self._handle_llm_error()
|
|
386
392
|
|
|
387
393
|
self.messages.append({"role": "assistant", "content": reply})
|
|
388
394
|
|
|
@@ -458,7 +464,7 @@ class AutonomousSession:
|
|
|
458
464
|
|
|
459
465
|
|
|
460
466
|
def run_autonomous_session(
|
|
461
|
-
diagnostics:
|
|
467
|
+
diagnostics: dict[str, Any],
|
|
462
468
|
config: FixOsConfig,
|
|
463
469
|
show_data: bool = True,
|
|
464
470
|
max_fixes: int = 10,
|