fixos 2.2.46__tar.gz → 2.2.48__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.
Files changed (220) hide show
  1. {fixos-2.2.46 → fixos-2.2.48}/CHANGELOG.md +107 -5
  2. {fixos-2.2.46 → fixos-2.2.48}/MANIFEST.in +1 -0
  3. {fixos-2.2.46 → fixos-2.2.48}/PKG-INFO +50 -16
  4. {fixos-2.2.46 → fixos-2.2.48}/README.md +48 -13
  5. {fixos-2.2.46 → fixos-2.2.48}/docker/debian/Dockerfile +1 -0
  6. {fixos-2.2.46 → fixos-2.2.48}/docker/fedora/Dockerfile +1 -0
  7. {fixos-2.2.46 → fixos-2.2.48}/docker/ubuntu/Dockerfile +1 -0
  8. {fixos-2.2.46 → fixos-2.2.48}/fixos/__init__.py +1 -1
  9. {fixos-2.2.46 → fixos-2.2.48}/fixos/agent/autonomous_session.py +29 -23
  10. fixos-2.2.48/fixos/agent/hitl_session.py +386 -0
  11. fixos-2.2.48/fixos/agent/session_core.py +781 -0
  12. {fixos-2.2.46 → fixos-2.2.48}/fixos/agent/session_handlers.py +253 -16
  13. {fixos-2.2.46 → fixos-2.2.48}/fixos/agent/session_io.py +127 -18
  14. fixos-2.2.48/fixos/anonymizer.py +18 -0
  15. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/_cleanup_flatpak.py +5 -1
  16. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/_cleanup_utils.py +15 -2
  17. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/ask_cmd.py +256 -55
  18. fixos-2.2.48/fixos/cli/cleanup_cmd.py +1740 -0
  19. fixos-2.2.48/fixos/cli/jetbrains_cmd.py +358 -0
  20. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/main.py +90 -21
  21. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/projects_cmd.py +156 -12
  22. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/quick_cmd.py +10 -12
  23. fixos-2.2.48/fixos/cli/shared.py +202 -0
  24. fixos-2.2.48/fixos/cli/shell_cmd.py +199 -0
  25. {fixos-2.2.46 → fixos-2.2.48}/fixos/config.py +105 -11
  26. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/_storage_system_mixin.py +62 -17
  27. fixos-2.2.48/fixos/diagnostics/docker_network_cleanup.py +282 -0
  28. fixos-2.2.48/fixos/diagnostics/docker_startup_optimizer.py +560 -0
  29. fixos-2.2.48/fixos/diagnostics/jetbrains_ai.py +294 -0
  30. fixos-2.2.48/fixos/diagnostics/jetbrains_recovery.py +638 -0
  31. fixos-2.2.48/fixos/diagnostics/orphaned_workloads.py +731 -0
  32. fixos-2.2.48/fixos/diagnostics/process_chains.py +594 -0
  33. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/quick_snapshot.py +36 -18
  34. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/service_cleanup.py +442 -86
  35. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/service_scanner.py +99 -38
  36. fixos-2.2.48/fixos/endpoint_refresh.py +200 -0
  37. fixos-2.2.48/fixos/features/data/packages.yaml +316 -0
  38. fixos-2.2.48/fixos/features/data/profiles/developer.yaml +13 -0
  39. fixos-2.2.48/fixos/features/data/profiles/office.yaml +9 -0
  40. fixos-2.2.48/fixos/features/data/profiles/sysadmin.yaml +13 -0
  41. fixos-2.2.48/fixos/orphan_pins.py +155 -0
  42. fixos-2.2.48/fixos/profiles/desktop.yaml +12 -0
  43. fixos-2.2.48/fixos/profiles/developer.yaml +10 -0
  44. fixos-2.2.48/fixos/profiles/minimal.yaml +5 -0
  45. fixos-2.2.48/fixos/profiles/server.yaml +11 -0
  46. {fixos-2.2.46 → fixos-2.2.48}/fixos/providers/llm.py +66 -23
  47. fixos-2.2.48/fixos/utils/anonymizer.py +560 -0
  48. {fixos-2.2.46 → fixos-2.2.48}/fixos.egg-info/PKG-INFO +50 -16
  49. {fixos-2.2.46 → fixos-2.2.48}/fixos.egg-info/SOURCES.txt +33 -0
  50. {fixos-2.2.46 → fixos-2.2.48}/fixos.egg-info/requires.txt +3 -2
  51. {fixos-2.2.46 → fixos-2.2.48}/fixos.egg-info/top_level.txt +0 -3
  52. {fixos-2.2.46 → fixos-2.2.48}/pyproject.toml +23 -20
  53. {fixos-2.2.46 → fixos-2.2.48}/pytest.ini +2 -1
  54. {fixos-2.2.46 → fixos-2.2.48}/setup.py +2 -1
  55. {fixos-2.2.46 → fixos-2.2.48}/tests/e2e/test_anonymization_layers.py +39 -16
  56. {fixos-2.2.46 → fixos-2.2.48}/tests/e2e/test_audio_broken.py +4 -2
  57. {fixos-2.2.46 → fixos-2.2.48}/tests/e2e/test_multi_system.py +6 -1
  58. fixos-2.2.48/tests/unit/test_anonymizer.py +390 -0
  59. fixos-2.2.48/tests/unit/test_ask_and_nl_group.py +278 -0
  60. fixos-2.2.48/tests/unit/test_cleanup_cmd.py +824 -0
  61. fixos-2.2.48/tests/unit/test_cleanup_effectiveness.py +177 -0
  62. fixos-2.2.48/tests/unit/test_cleanup_safety.py +314 -0
  63. fixos-2.2.48/tests/unit/test_cleanup_utils.py +79 -0
  64. fixos-2.2.48/tests/unit/test_core.py +1098 -0
  65. fixos-2.2.48/tests/unit/test_docker_network_cleanup.py +274 -0
  66. fixos-2.2.48/tests/unit/test_docker_startup_optimizer.py +369 -0
  67. fixos-2.2.48/tests/unit/test_endpoint_refresh.py +169 -0
  68. fixos-2.2.48/tests/unit/test_jetbrains_cmd.py +293 -0
  69. fixos-2.2.48/tests/unit/test_jetbrains_recovery.py +383 -0
  70. fixos-2.2.48/tests/unit/test_llm_auth_stop.py +160 -0
  71. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_llm_provider.py +70 -0
  72. fixos-2.2.48/tests/unit/test_orphan_pins.py +137 -0
  73. fixos-2.2.48/tests/unit/test_orphaned_workloads.py +306 -0
  74. fixos-2.2.48/tests/unit/test_packaging_data.py +57 -0
  75. fixos-2.2.48/tests/unit/test_process_chains.py +300 -0
  76. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_projects_cmd.py +125 -3
  77. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_quick_cmd.py +22 -0
  78. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_quick_snapshot.py +30 -0
  79. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_service_cleanup.py +119 -12
  80. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_service_scanner.py +19 -11
  81. fixos-2.2.48/tests/unit/test_storage_analyzer.py +72 -0
  82. fixos-2.2.46/fixos/agent/hitl_session.py +0 -246
  83. fixos-2.2.46/fixos/agent/session_core.py +0 -245
  84. fixos-2.2.46/fixos/anonymizer.py +0 -80
  85. fixos-2.2.46/fixos/cli/cleanup_cmd.py +0 -892
  86. fixos-2.2.46/fixos/cli/shared.py +0 -115
  87. fixos-2.2.46/fixos/utils/anonymizer.py +0 -356
  88. fixos-2.2.46/tests/unit/test_anonymizer.py +0 -198
  89. fixos-2.2.46/tests/unit/test_cleanup_cmd.py +0 -389
  90. fixos-2.2.46/tests/unit/test_core.py +0 -385
  91. {fixos-2.2.46 → fixos-2.2.48}/.env.example +0 -0
  92. {fixos-2.2.46 → fixos-2.2.48}/LICENSE +0 -0
  93. {fixos-2.2.46 → fixos-2.2.48}/docker/README.md +0 -0
  94. {fixos-2.2.46 → fixos-2.2.48}/docker/TEST_RESULTS.md +0 -0
  95. {fixos-2.2.46 → fixos-2.2.48}/docker/TEST_RESULTS_V2.md +0 -0
  96. {fixos-2.2.46 → fixos-2.2.48}/docker/alpine/Dockerfile +0 -0
  97. {fixos-2.2.46 → fixos-2.2.48}/docker/arch/Dockerfile +0 -0
  98. {fixos-2.2.46 → fixos-2.2.48}/docker/base/Dockerfile +0 -0
  99. {fixos-2.2.46 → fixos-2.2.48}/docker/broken-audio/Dockerfile +0 -0
  100. {fixos-2.2.46 → fixos-2.2.48}/docker/broken-full/Dockerfile +0 -0
  101. {fixos-2.2.46 → fixos-2.2.48}/docker/broken-network/Dockerfile +0 -0
  102. {fixos-2.2.46 → fixos-2.2.48}/docker/broken-thumbnails/Dockerfile +0 -0
  103. {fixos-2.2.46 → fixos-2.2.48}/docker/docker-compose.multi-system.yml +0 -0
  104. {fixos-2.2.46 → fixos-2.2.48}/docker/docker-compose.yml +0 -0
  105. {fixos-2.2.46 → fixos-2.2.48}/docker/test-multi-system.sh +0 -0
  106. {fixos-2.2.46 → fixos-2.2.48}/docker/test-scenarios.sh +0 -0
  107. {fixos-2.2.46 → fixos-2.2.48}/docker/validate-scenario.py +0 -0
  108. {fixos-2.2.46 → fixos-2.2.48}/docs/examples/advanced_usage.py +0 -0
  109. {fixos-2.2.46 → fixos-2.2.48}/docs/examples/quickstart.py +0 -0
  110. {fixos-2.2.46 → fixos-2.2.48}/fixos/__main__.py +0 -0
  111. {fixos-2.2.46 → fixos-2.2.48}/fixos/agent/__init__.py +0 -0
  112. {fixos-2.2.46 → fixos-2.2.48}/fixos/agent/autonomous.py +0 -0
  113. {fixos-2.2.46 → fixos-2.2.48}/fixos/agent/hitl.py +0 -0
  114. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/__init__.py +0 -0
  115. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/_cleanup_home.py +0 -0
  116. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/_cleanup_snap.py +0 -0
  117. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/_cleanup_system.py +0 -0
  118. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/config_cmd.py +0 -0
  119. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/features_cmd.py +0 -0
  120. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/fix_cmd.py +0 -0
  121. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/history_cmd.py +0 -0
  122. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/orchestrate_cmd.py +0 -0
  123. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/output_formatter.py +0 -0
  124. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/profile_cmd.py +0 -0
  125. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/provider_cmd.py +0 -0
  126. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/quickfix_cmd.py +0 -0
  127. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/report_cmd.py +0 -0
  128. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/rollback_cmd.py +0 -0
  129. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/scan_cmd.py +0 -0
  130. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/token_cmd.py +0 -0
  131. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli/watch_cmd.py +0 -0
  132. {fixos-2.2.46 → fixos-2.2.48}/fixos/cli.py +0 -0
  133. {fixos-2.2.46 → fixos-2.2.48}/fixos/config_interactive.py +0 -0
  134. {fixos-2.2.46 → fixos-2.2.48}/fixos/constants.py +0 -0
  135. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/__init__.py +0 -0
  136. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/_flatpak_analysis_mixin.py +0 -0
  137. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/_flatpak_execution_mixin.py +0 -0
  138. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/_flatpak_recommendations_mixin.py +0 -0
  139. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/_storage_container_mixin.py +0 -0
  140. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/_storage_user_mixin.py +0 -0
  141. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/cache_discovery.py +0 -0
  142. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/__init__.py +0 -0
  143. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/_shared.py +0 -0
  144. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/audio.py +0 -0
  145. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/file_analysis.py +0 -0
  146. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/hardware.py +0 -0
  147. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/packages.py +0 -0
  148. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/resources.py +0 -0
  149. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/security.py +0 -0
  150. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/storage_optimization.py +0 -0
  151. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/system_core.py +0 -0
  152. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/checks/thumbnails.py +0 -0
  153. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/dev_project_analyzer.py +0 -0
  154. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/disk_analyzer.py +0 -0
  155. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/flatpak_analyzer.py +0 -0
  156. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/project_scanner.py +0 -0
  157. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/service_details.py +0 -0
  158. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/storage_analyzer.py +0 -0
  159. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/system_checks.py +0 -0
  160. {fixos-2.2.46 → fixos-2.2.48}/fixos/diagnostics/utils.py +0 -0
  161. {fixos-2.2.46 → fixos-2.2.48}/fixos/features/__init__.py +0 -0
  162. {fixos-2.2.46 → fixos-2.2.48}/fixos/features/auditor.py +0 -0
  163. {fixos-2.2.46 → fixos-2.2.48}/fixos/features/catalog.py +0 -0
  164. {fixos-2.2.46 → fixos-2.2.48}/fixos/features/installer.py +0 -0
  165. {fixos-2.2.46 → fixos-2.2.48}/fixos/features/profiles.py +0 -0
  166. {fixos-2.2.46 → fixos-2.2.48}/fixos/features/renderer.py +0 -0
  167. {fixos-2.2.46 → fixos-2.2.48}/fixos/fixes/__init__.py +0 -0
  168. {fixos-2.2.46 → fixos-2.2.48}/fixos/interactive/__init__.py +0 -0
  169. {fixos-2.2.46 → fixos-2.2.48}/fixos/interactive/cleanup_planner.py +0 -0
  170. {fixos-2.2.46 → fixos-2.2.48}/fixos/llm_shell.py +0 -0
  171. {fixos-2.2.46 → fixos-2.2.48}/fixos/orchestrator/__init__.py +0 -0
  172. {fixos-2.2.46 → fixos-2.2.48}/fixos/orchestrator/executor.py +0 -0
  173. {fixos-2.2.46 → fixos-2.2.48}/fixos/orchestrator/graph.py +0 -0
  174. {fixos-2.2.46 → fixos-2.2.48}/fixos/orchestrator/orchestrator.py +0 -0
  175. {fixos-2.2.46 → fixos-2.2.48}/fixos/orchestrator/rollback.py +0 -0
  176. {fixos-2.2.46 → fixos-2.2.48}/fixos/platform_utils.py +0 -0
  177. {fixos-2.2.46 → fixos-2.2.48}/fixos/plugins/__init__.py +0 -0
  178. {fixos-2.2.46 → fixos-2.2.48}/fixos/plugins/base.py +0 -0
  179. {fixos-2.2.46 → fixos-2.2.48}/fixos/plugins/builtin/__init__.py +0 -0
  180. {fixos-2.2.46 → fixos-2.2.48}/fixos/plugins/builtin/audio.py +0 -0
  181. {fixos-2.2.46 → fixos-2.2.48}/fixos/plugins/builtin/disk.py +0 -0
  182. {fixos-2.2.46 → fixos-2.2.48}/fixos/plugins/builtin/hardware.py +0 -0
  183. {fixos-2.2.46 → fixos-2.2.48}/fixos/plugins/builtin/resources.py +0 -0
  184. {fixos-2.2.46 → fixos-2.2.48}/fixos/plugins/builtin/security.py +0 -0
  185. {fixos-2.2.46 → fixos-2.2.48}/fixos/plugins/builtin/thumbnails.py +0 -0
  186. {fixos-2.2.46 → fixos-2.2.48}/fixos/plugins/registry.py +0 -0
  187. {fixos-2.2.46 → fixos-2.2.48}/fixos/profiles/__init__.py +0 -0
  188. {fixos-2.2.46 → fixos-2.2.48}/fixos/providers/__init__.py +0 -0
  189. {fixos-2.2.46 → fixos-2.2.48}/fixos/providers/llm_analyzer.py +0 -0
  190. {fixos-2.2.46 → fixos-2.2.48}/fixos/providers/schemas.py +0 -0
  191. {fixos-2.2.46 → fixos-2.2.48}/fixos/system_checks.py +0 -0
  192. {fixos-2.2.46 → fixos-2.2.48}/fixos/utils/__init__.py +0 -0
  193. {fixos-2.2.46 → fixos-2.2.48}/fixos/utils/terminal.py +0 -0
  194. {fixos-2.2.46 → fixos-2.2.48}/fixos/utils/timeout.py +0 -0
  195. {fixos-2.2.46 → fixos-2.2.48}/fixos/utils/web_search.py +0 -0
  196. {fixos-2.2.46 → fixos-2.2.48}/fixos/watch.py +0 -0
  197. {fixos-2.2.46 → fixos-2.2.48}/fixos.egg-info/dependency_links.txt +0 -0
  198. {fixos-2.2.46 → fixos-2.2.48}/fixos.egg-info/entry_points.txt +0 -0
  199. {fixos-2.2.46 → fixos-2.2.48}/requirements-dev.txt +0 -0
  200. {fixos-2.2.46 → fixos-2.2.48}/requirements.txt +0 -0
  201. {fixos-2.2.46 → fixos-2.2.48}/scripts/pyqual-calibrate.py +0 -0
  202. {fixos-2.2.46 → fixos-2.2.48}/setup.cfg +0 -0
  203. {fixos-2.2.46 → fixos-2.2.48}/tests/__init__.py +0 -0
  204. {fixos-2.2.46 → fixos-2.2.48}/tests/conftest.py +0 -0
  205. {fixos-2.2.46 → fixos-2.2.48}/tests/e2e/__init__.py +0 -0
  206. {fixos-2.2.46 → fixos-2.2.48}/tests/e2e/test_cli.py +0 -0
  207. {fixos-2.2.46 → fixos-2.2.48}/tests/e2e/test_diagnostics_integration.py +0 -0
  208. {fixos-2.2.46 → fixos-2.2.48}/tests/e2e/test_executor.py +0 -0
  209. {fixos-2.2.46 → fixos-2.2.48}/tests/e2e/test_network_broken.py +0 -0
  210. {fixos-2.2.46 → fixos-2.2.48}/tests/e2e/test_thumbnails_broken.py +0 -0
  211. {fixos-2.2.46 → fixos-2.2.48}/tests/test_fixos.py +0 -0
  212. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/__init__.py +0 -0
  213. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_cache_discovery.py +0 -0
  214. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_dev_project_analyzer.py +0 -0
  215. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_executor.py +0 -0
  216. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_orchestrator.py +0 -0
  217. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_project_scanner.py +0 -0
  218. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_resources_quick.py +0 -0
  219. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_security_quick.py +0 -0
  220. {fixos-2.2.46 → fixos-2.2.48}/tests/unit/test_system_checks_parallel.py +0 -0
@@ -2,15 +2,25 @@
2
2
 
3
3
  ### Added
4
4
 
5
- - `fixos cleanup --docker-old [--days N]` oraz `-c docker-old`: usuwa wyłącznie
6
- nieużywane obrazy Docker i build cache starsze niż N dni (domyślnie 30);
7
- bez wolumenów i bez obrazów używanych przez kontenery.
5
+ - `fixos cleanup --docker-networks [--days N]` oraz `-c docker-networks`:
6
+ bezpieczny podgląd i usuwanie niestandardowych sieci Docker bez endpointów,
7
+ z ochroną sieci aktywnych/wbudowanych i końcowym testem puli adresowej.
8
+ - `fixos cleanup --docker-all` / `-c docker-all`: jedna operacja dla wszystkich
9
+ nieużywanych obrazów, build cache i osieroconych sieci, bez kontenerów i
10
+ wolumenów. `--docker-old` oraz interaktywne czyszczenie Dockera również
11
+ dołączają osierocone sieci.
12
+ - `fixos projects --docker-networks`: opcjonalne usuwanie sieci `dangling`
13
+ należących do wybranych projektów Compose, z dopasowaniem po etykiecie,
14
+ osobnym potwierdzeniem i usuwaniem wyłącznie wcześniej pokazanych ID.
15
+ - `fixos cleanup --docker-old [--days N]` oraz `-c docker-old`: usuwa
16
+ nieużywane obrazy Docker i build cache starsze niż N dni (domyślnie 30)
17
+ oraz osierocone sieci; bez wolumenów i obrazów używanych przez kontenery.
8
18
  - `fixos cleanup --ollama-old [--days N]` oraz `-c ollama-old`: usuwa modele
9
19
  Ollama niezmieniane od N dni (domyślnie 90), z pominięciem modeli
10
20
  aktualnie załadowanych (`/api/ps`).
11
21
  - Opcja interaktywna **[1] Wszystkie bezpieczne** obejmuje teraz także:
12
- - **Docker (nieużywane obrazy)** — pełną pulę unused (zgodną z RECLAIMABLE
13
- Images+Build Cache), bez filtra wieku,
22
+ - **Docker (nieużywane zasoby)** — pełną pulę unused Images+Build Cache
23
+ oraz osierocone sieci, bez filtra wieku,
14
24
  - **Ollama (modele >90 dni)** — gdy takie modele istnieją.
15
25
  - Pomiar zwolnionego miejsca Dockera przez `docker system df` przed/po oraz
16
26
  parsowanie `Total reclaimed space`; ostrzeżenie przy 0.00 GB mimo sukcesu
@@ -70,6 +80,98 @@
70
80
  rekurencyjnych skanów `/` oraz `/home` z szybkich kontroli.
71
81
  - Czyszczenie cache JetBrains trafia w aktualną ścieżkę i wymaga zamknięcia IDE.
72
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
+
153
+ ## [2.2.47] - 2026-08-13
154
+
155
+ ### Docs
156
+ - Update CHANGELOG.md
157
+ - Update README.md
158
+ - Update docs/architecture.md
159
+ - Update docs/getting-started.md
160
+
161
+ ### Test
162
+ - Update tests/unit/test_cleanup_cmd.py
163
+ - Update tests/unit/test_docker_network_cleanup.py
164
+ - Update tests/unit/test_projects_cmd.py
165
+ - Update tests/unit/test_service_cleanup.py
166
+
167
+ ### Other
168
+ - Update fixos/cli/cleanup_cmd.py
169
+ - Update fixos/cli/main.py
170
+ - Update fixos/cli/projects_cmd.py
171
+ - Update fixos/diagnostics/docker_network_cleanup.py
172
+ - Update fixos/diagnostics/service_cleanup.py
173
+ - Update uv.lock
174
+
73
175
  ## [2.2.46] - 2026-08-07
74
176
 
75
177
  ### Docs
@@ -6,6 +6,7 @@ include requirements-dev.txt
6
6
  include .env.example
7
7
  include pytest.ini
8
8
  recursive-include fixos *.py
9
+ recursive-include fixos *.yaml
9
10
  recursive-include tests *.py
10
11
  recursive-include docker *
11
12
  prune docker/__pycache__
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fixos
3
- Version: 2.2.46
3
+ Version: 2.2.48
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
@@ -35,13 +35,13 @@ Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
35
35
  Requires-Dist: pytest-xdist>=3.5.0; extra == "dev"
36
36
  Requires-Dist: pytest-timeout>=2.2.0; extra == "dev"
37
37
  Requires-Dist: pytest-sugar>=0.9.7; extra == "dev"
38
- Requires-Dist: goal>=2.1.0; extra == "dev"
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; extra == "dev"
41
40
  Dynamic: home-page
42
41
  Dynamic: license-file
43
42
  Dynamic: requires-python
44
43
 
44
+ ![img3.png](img3.png)
45
45
  ```
46
46
  ___ _ ___ ____
47
47
  / _(_)_ __ / _ \/ ___|
@@ -63,13 +63,13 @@ AI-powered OS Diagnostics
63
63
 
64
64
  ## AI Cost Tracking
65
65
 
66
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.46-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
67
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.84-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-40.6h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
66
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.48-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
67
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.90-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-42.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
68
68
 
69
- - 🤖 **LLM usage:** $4.8388 (151 commits)
70
- - 👤 **Human dev:** ~$4059 (40.6h @ $100/h, 30min dedup)
69
+ - 🤖 **LLM usage:** $4.9010 (154 commits)
70
+ - 👤 **Human dev:** ~$4216 (42.2h @ $100/h, 30min dedup)
71
71
 
72
- Generated on 2026-08-07 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
72
+ Generated on 2026-08-13 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
73
73
 
74
74
  ---
75
75
 
@@ -118,10 +118,13 @@ fixos quick --deep – szybki wynik, potem pełny skan danych usług
118
118
  fixos fix – diagnoza + sesja naprawcza z AI (HITL)
119
119
  fixos scan – diagnostyka systemu bez AI
120
120
  fixos cleanup – skanuj i czyść dane usług (Docker, npm, pip, ...)
121
- fixos cleanup --docker-old – nieużywane obrazy Docker starsze niż N dni (--days)
121
+ fixos cleanup --docker-all – wszystkie unused images/cache + osierocone sieci
122
+ fixos cleanup --docker-old – stare unused images/cache + osierocone sieci
123
+ fixos cleanup --docker-networks – tylko osierocone sieci + test puli
122
124
  fixos cleanup --ollama-old – modele Ollama niezmieniane od N dni (domyślnie 90)
123
125
  fixos cleanup --full – pełny audit systemu + dev projects
124
126
  fixos projects – skanuj projekty dev (venv, node_modules, ~/github/*/*)
127
+ fixos projects --docker-networks – nieużywane sieci Compose wybranych projektów
125
128
  fixos orchestrate – zaawansowana orkiestracja (graf problemów DAG)
126
129
  fixos llm – lista 12 providerów LLM + linki do kluczy API
127
130
  fixos token set KEY – zapisz klucz API do .env (auto-detekcja providera)
@@ -157,12 +160,19 @@ fixos cleanup --full --dry-run
157
160
 
158
161
  # Podgląd usług + interaktywne czyszczenie (opcja [1] = wszystkie bezpieczne)
159
162
  fixos cleanup --list
160
- fixos cleanup --dry-run # tylko gdy -c / --docker-old / --ollama-old
163
+ fixos cleanup --dry-run # tylko gdy -c / --docker-all / --docker-old / ...
161
164
  fixos cleanup
162
165
 
163
- # Nieużywane obrazy Docker starsze niż 30 dni (filtr wieku; może zwolnić mniej niż RECLAIMABLE)
166
+ # Wszystkie unused images/cache oraz osierocone sieci (bez wolumenów)
167
+ fixos cleanup --docker-all --dry-run
168
+
169
+ # Obrazy/cache starsze niż 30 dni oraz wszystkie osierocone sieci
164
170
  fixos cleanup --docker-old --days 30 --dry-run
165
171
 
172
+ # Sieci Docker bez endpointów; aktywne i wbudowane pozostają chronione
173
+ fixos cleanup --docker-networks --dry-run
174
+ fixos cleanup --docker-networks
175
+
166
176
  # Modele Ollama niezmieniane od 90+ dni (pomija uruchomione)
167
177
  fixos cleanup --ollama-old --days 90 --dry-run
168
178
 
@@ -185,6 +195,9 @@ fixos projects
185
195
  # Tylko artefakty nieużywane od >60 dni (bez świeżych venv)
186
196
  fixos projects --only-stale
187
197
 
198
+ # Stare artefakty + podgląd powiązanych, nieużywanych sieci Compose
199
+ fixos projects --only-stale --docker-networks --dry-run
200
+
188
201
  # Podgląd bez usuwania
189
202
  fixos projects --dry-run
190
203
 
@@ -274,9 +287,9 @@ Każda znaleziona usługa jest klasyfikowana do jednej z trzech grup:
274
287
 
275
288
  - **bezpieczne** – cache do odtworzenia jednym poleceniem (pip/npm/cargo/conda/nix/brew...)
276
289
  oraz ograniczone, jawnie bezpieczne akcje wiekowe / reclaimable:
277
- - **Docker (nieużywane obrazy)** — wszystkie unused images + build cache
278
- (bez wolumenów, bez obrazów podpiętych do kontenerów); odpowiada puli
279
- `RECLAIMABLE` Images+Build Cache,
290
+ - **Docker (nieużywane zasoby)** — wszystkie unused images + build cache
291
+ oraz osierocone sieci bez endpointów (bez wolumenów, bez obrazów
292
+ podpiętych do kontenerów); część dyskowa odpowiada puli `RECLAIMABLE`,
280
293
  - **Ollama (modele >90 dni)** — modele niezmieniane od 90+ dni; pomija
281
294
  modele aktualnie załadowane w pamięci.
282
295
  Tylko tę grupę usuwa opcja **[1] Wszystkie bezpieczne**.
@@ -289,13 +302,26 @@ Każda znaleziona usługa jest klasyfikowana do jednej z trzech grup:
289
302
  zbiorcze kasowanie modeli „na ślepo”, klastrów, maszyn wirtualnych, rozszerzeń i
290
303
  wolumenów jest wyłączone.
291
304
 
292
- Dedykowane flagi (też dostępne jako `-c docker-old` / `-c ollama-old`):
305
+ Dedykowane flagi (też dostępne jako `-c docker-all`, `-c docker-old`,
306
+ `-c docker-networks` oraz `-c ollama-old`):
293
307
 
294
308
  ```bash
295
- fixos cleanup --docker-old --days 30 --dry-run # tylko unused starsze niż N dni
309
+ fixos cleanup --docker-all --dry-run # all unused + sieci
310
+ fixos cleanup --docker-old --days 30 --dry-run # stare unused + sieci
311
+ fixos cleanup --docker-networks --dry-run # sieci bez endpointów
296
312
  fixos cleanup --ollama-old --days 90 --dry-run # modele niezmieniane od N dni
297
313
  ```
298
314
 
315
+ Osierocone sieci są czyszczone automatycznie razem z `--docker-all`,
316
+ `--docker-old` oraz dockerową pozycją w „Wszystkie bezpieczne”. Samodzielne
317
+ `--docker-networks` pozostaje dostępne, gdy obrazy i cache mają pozostać.
318
+ Mechanizm pobiera kandydatów z `dangling=true`, ponownie sprawdza brak
319
+ endpointów, chroni sieci `bridge`, `host` i `none`, a usuwa dokładne ID zamiast
320
+ wykonywać szeroki prune. Po wykonaniu tworzy i natychmiast usuwa sieć testową
321
+ oznaczoną `dev.fixos.cleanup-probe=true`; sukces potwierdza, że daemon może
322
+ ponownie przydzielić podsieć. Opcjonalne `--days N` dla samodzielnej akcji
323
+ ogranicza ją do sieci mających co najmniej N dni; domyślne `0` obejmuje wszystkie.
324
+
299
325
  `RECLAIMABLE` Dockera obejmuje też świeże unused images. Filtr `--docker-old`
300
326
  (domyślnie 30 dni) może więc zwolnić **znacznie mniej** niż szacunek całej puli —
301
327
  dlatego opcja `[1]` używa prune **wszystkich** nieużywanych obrazów, a
@@ -323,6 +349,14 @@ nazwie), `node_modules`/`.next`/`.turbo` (tylko gdy jest `package.json`),
323
349
  nieużywane od >60 dni (`--stale-days`) oraz projekty ze zduplikowanymi
324
350
  virtualenvami (np. i `venv`, i `.venv` naraz).
325
351
 
352
+ Opcjonalne `--docker-networks` dołącza do czyszczenia wybranych projektów
353
+ ich nieużywane sieci Docker Compose. Dopasowanie wymaga dokładnej etykiety
354
+ `com.docker.compose.project`; sieci bez tej etykiety nie są zgadywane po
355
+ nazwie. fixOS ponownie wymaga stanu `dangling`, chroni sieci z endpointami,
356
+ pokazuje nazwę, ID i podsieć, a przed usunięciem pyta o osobne potwierdzenie.
357
+ Usuwane są tylko ID pokazane w podglądzie, po czym wykonywany jest test puli
358
+ adresowej. Repozytorium projektu, kontenery i wolumeny pozostają nietknięte.
359
+
326
360
  ```bash
327
361
  $ fixos projects --only-stale
328
362
 
@@ -1,3 +1,4 @@
1
+ ![img3.png](img3.png)
1
2
  ```
2
3
  ___ _ ___ ____
3
4
  / _(_)_ __ / _ \/ ___|
@@ -19,13 +20,13 @@ AI-powered OS Diagnostics
19
20
 
20
21
  ## AI Cost Tracking
21
22
 
22
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.46-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
23
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.84-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-40.6h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
23
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.2.48-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
24
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$4.90-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-42.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
24
25
 
25
- - 🤖 **LLM usage:** $4.8388 (151 commits)
26
- - 👤 **Human dev:** ~$4059 (40.6h @ $100/h, 30min dedup)
26
+ - 🤖 **LLM usage:** $4.9010 (154 commits)
27
+ - 👤 **Human dev:** ~$4216 (42.2h @ $100/h, 30min dedup)
27
28
 
28
- Generated on 2026-08-07 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
29
+ Generated on 2026-08-13 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
29
30
 
30
31
  ---
31
32
 
@@ -74,10 +75,13 @@ fixos quick --deep – szybki wynik, potem pełny skan danych usług
74
75
  fixos fix – diagnoza + sesja naprawcza z AI (HITL)
75
76
  fixos scan – diagnostyka systemu bez AI
76
77
  fixos cleanup – skanuj i czyść dane usług (Docker, npm, pip, ...)
77
- fixos cleanup --docker-old – nieużywane obrazy Docker starsze niż N dni (--days)
78
+ fixos cleanup --docker-all – wszystkie unused images/cache + osierocone sieci
79
+ fixos cleanup --docker-old – stare unused images/cache + osierocone sieci
80
+ fixos cleanup --docker-networks – tylko osierocone sieci + test puli
78
81
  fixos cleanup --ollama-old – modele Ollama niezmieniane od N dni (domyślnie 90)
79
82
  fixos cleanup --full – pełny audit systemu + dev projects
80
83
  fixos projects – skanuj projekty dev (venv, node_modules, ~/github/*/*)
84
+ fixos projects --docker-networks – nieużywane sieci Compose wybranych projektów
81
85
  fixos orchestrate – zaawansowana orkiestracja (graf problemów DAG)
82
86
  fixos llm – lista 12 providerów LLM + linki do kluczy API
83
87
  fixos token set KEY – zapisz klucz API do .env (auto-detekcja providera)
@@ -113,12 +117,19 @@ fixos cleanup --full --dry-run
113
117
 
114
118
  # Podgląd usług + interaktywne czyszczenie (opcja [1] = wszystkie bezpieczne)
115
119
  fixos cleanup --list
116
- fixos cleanup --dry-run # tylko gdy -c / --docker-old / --ollama-old
120
+ fixos cleanup --dry-run # tylko gdy -c / --docker-all / --docker-old / ...
117
121
  fixos cleanup
118
122
 
119
- # Nieużywane obrazy Docker starsze niż 30 dni (filtr wieku; może zwolnić mniej niż RECLAIMABLE)
123
+ # Wszystkie unused images/cache oraz osierocone sieci (bez wolumenów)
124
+ fixos cleanup --docker-all --dry-run
125
+
126
+ # Obrazy/cache starsze niż 30 dni oraz wszystkie osierocone sieci
120
127
  fixos cleanup --docker-old --days 30 --dry-run
121
128
 
129
+ # Sieci Docker bez endpointów; aktywne i wbudowane pozostają chronione
130
+ fixos cleanup --docker-networks --dry-run
131
+ fixos cleanup --docker-networks
132
+
122
133
  # Modele Ollama niezmieniane od 90+ dni (pomija uruchomione)
123
134
  fixos cleanup --ollama-old --days 90 --dry-run
124
135
 
@@ -141,6 +152,9 @@ fixos projects
141
152
  # Tylko artefakty nieużywane od >60 dni (bez świeżych venv)
142
153
  fixos projects --only-stale
143
154
 
155
+ # Stare artefakty + podgląd powiązanych, nieużywanych sieci Compose
156
+ fixos projects --only-stale --docker-networks --dry-run
157
+
144
158
  # Podgląd bez usuwania
145
159
  fixos projects --dry-run
146
160
 
@@ -230,9 +244,9 @@ Każda znaleziona usługa jest klasyfikowana do jednej z trzech grup:
230
244
 
231
245
  - **bezpieczne** – cache do odtworzenia jednym poleceniem (pip/npm/cargo/conda/nix/brew...)
232
246
  oraz ograniczone, jawnie bezpieczne akcje wiekowe / reclaimable:
233
- - **Docker (nieużywane obrazy)** — wszystkie unused images + build cache
234
- (bez wolumenów, bez obrazów podpiętych do kontenerów); odpowiada puli
235
- `RECLAIMABLE` Images+Build Cache,
247
+ - **Docker (nieużywane zasoby)** — wszystkie unused images + build cache
248
+ oraz osierocone sieci bez endpointów (bez wolumenów, bez obrazów
249
+ podpiętych do kontenerów); część dyskowa odpowiada puli `RECLAIMABLE`,
236
250
  - **Ollama (modele >90 dni)** — modele niezmieniane od 90+ dni; pomija
237
251
  modele aktualnie załadowane w pamięci.
238
252
  Tylko tę grupę usuwa opcja **[1] Wszystkie bezpieczne**.
@@ -245,13 +259,26 @@ Każda znaleziona usługa jest klasyfikowana do jednej z trzech grup:
245
259
  zbiorcze kasowanie modeli „na ślepo”, klastrów, maszyn wirtualnych, rozszerzeń i
246
260
  wolumenów jest wyłączone.
247
261
 
248
- Dedykowane flagi (też dostępne jako `-c docker-old` / `-c ollama-old`):
262
+ Dedykowane flagi (też dostępne jako `-c docker-all`, `-c docker-old`,
263
+ `-c docker-networks` oraz `-c ollama-old`):
249
264
 
250
265
  ```bash
251
- fixos cleanup --docker-old --days 30 --dry-run # tylko unused starsze niż N dni
266
+ fixos cleanup --docker-all --dry-run # all unused + sieci
267
+ fixos cleanup --docker-old --days 30 --dry-run # stare unused + sieci
268
+ fixos cleanup --docker-networks --dry-run # sieci bez endpointów
252
269
  fixos cleanup --ollama-old --days 90 --dry-run # modele niezmieniane od N dni
253
270
  ```
254
271
 
272
+ Osierocone sieci są czyszczone automatycznie razem z `--docker-all`,
273
+ `--docker-old` oraz dockerową pozycją w „Wszystkie bezpieczne”. Samodzielne
274
+ `--docker-networks` pozostaje dostępne, gdy obrazy i cache mają pozostać.
275
+ Mechanizm pobiera kandydatów z `dangling=true`, ponownie sprawdza brak
276
+ endpointów, chroni sieci `bridge`, `host` i `none`, a usuwa dokładne ID zamiast
277
+ wykonywać szeroki prune. Po wykonaniu tworzy i natychmiast usuwa sieć testową
278
+ oznaczoną `dev.fixos.cleanup-probe=true`; sukces potwierdza, że daemon może
279
+ ponownie przydzielić podsieć. Opcjonalne `--days N` dla samodzielnej akcji
280
+ ogranicza ją do sieci mających co najmniej N dni; domyślne `0` obejmuje wszystkie.
281
+
255
282
  `RECLAIMABLE` Dockera obejmuje też świeże unused images. Filtr `--docker-old`
256
283
  (domyślnie 30 dni) może więc zwolnić **znacznie mniej** niż szacunek całej puli —
257
284
  dlatego opcja `[1]` używa prune **wszystkich** nieużywanych obrazów, a
@@ -279,6 +306,14 @@ nazwie), `node_modules`/`.next`/`.turbo` (tylko gdy jest `package.json`),
279
306
  nieużywane od >60 dni (`--stale-days`) oraz projekty ze zduplikowanymi
280
307
  virtualenvami (np. i `venv`, i `.venv` naraz).
281
308
 
309
+ Opcjonalne `--docker-networks` dołącza do czyszczenia wybranych projektów
310
+ ich nieużywane sieci Docker Compose. Dopasowanie wymaga dokładnej etykiety
311
+ `com.docker.compose.project`; sieci bez tej etykiety nie są zgadywane po
312
+ nazwie. fixOS ponownie wymaga stanu `dangling`, chroni sieci z endpointami,
313
+ pokazuje nazwę, ID i podsieć, a przed usunięciem pyta o osobne potwierdzenie.
314
+ Usuwane są tylko ID pokazane w podglądzie, po czym wykonywany jest test puli
315
+ adresowej. Repozytorium projektu, kontenery i wolumeny pozostają nietknięte.
316
+
282
317
  ```bash
283
318
  $ fixos projects --only-stale
284
319
 
@@ -13,6 +13,7 @@ RUN apt-get update && apt-get install -y \
13
13
  pipewire \
14
14
  wireplumber \
15
15
  findutils \
16
+ git \
16
17
  lsof \
17
18
  dbus \
18
19
  udev \
@@ -13,6 +13,7 @@ RUN dnf install -y \
13
13
  pipewire \
14
14
  wireplumber \
15
15
  findutils \
16
+ git \
16
17
  which \
17
18
  udev \
18
19
  dbus \
@@ -14,6 +14,7 @@ RUN apt-get update && apt-get install -y \
14
14
  pipewire \
15
15
  wireplumber \
16
16
  findutils \
17
+ git \
17
18
  lsof \
18
19
  dbus \
19
20
  udev \
@@ -1,3 +1,3 @@
1
1
  """fixos – AI-powered Linux/Windows diagnostics and repair."""
2
2
 
3
- __version__ = "2.2.46"
3
+ __version__ = "2.2.48"
@@ -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 Optional, List, Dict, Any
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: Optional[str] = None
85
- success: Optional[bool] = None
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: Dict[str, Any],
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: List[Dict[str, str]] = []
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) -> Optional[str]:
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) -> Optional[Dict[str, Any]]:
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) -> Optional[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: Dict[str, Any]) -> bool:
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: Dict[str, Any]) -> bool:
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: Dict[str, Any]) -> None:
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
- if not self._handle_llm_error():
384
- return False
385
- return True
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: Dict[str, Any],
467
+ diagnostics: dict[str, Any],
462
468
  config: FixOsConfig,
463
469
  show_data: bool = True,
464
470
  max_fixes: int = 10,