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.
Files changed (218) hide show
  1. {fixos-2.2.47 → fixos-2.2.49}/CHANGELOG.md +70 -0
  2. {fixos-2.2.47 → fixos-2.2.49}/MANIFEST.in +1 -0
  3. {fixos-2.2.47 → fixos-2.2.49}/PKG-INFO +6 -6
  4. {fixos-2.2.47 → fixos-2.2.49}/README.md +5 -4
  5. {fixos-2.2.47 → fixos-2.2.49}/docker/debian/Dockerfile +1 -0
  6. {fixos-2.2.47 → fixos-2.2.49}/docker/fedora/Dockerfile +1 -0
  7. {fixos-2.2.47 → fixos-2.2.49}/docker/ubuntu/Dockerfile +1 -0
  8. {fixos-2.2.47 → fixos-2.2.49}/fixos/__init__.py +1 -1
  9. {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/autonomous_session.py +29 -23
  10. fixos-2.2.49/fixos/agent/hitl_session.py +386 -0
  11. fixos-2.2.49/fixos/agent/session_core.py +781 -0
  12. {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/session_handlers.py +253 -16
  13. {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/session_io.py +127 -18
  14. fixos-2.2.49/fixos/anonymizer.py +18 -0
  15. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/_cleanup_flatpak.py +5 -1
  16. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/_cleanup_utils.py +15 -2
  17. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/ask_cmd.py +256 -55
  18. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/cleanup_cmd.py +742 -35
  19. fixos-2.2.49/fixos/cli/jetbrains_cmd.py +358 -0
  20. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/main.py +79 -20
  21. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/quick_cmd.py +10 -12
  22. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/shared.py +86 -3
  23. fixos-2.2.49/fixos/cli/shell_cmd.py +220 -0
  24. {fixos-2.2.47 → fixos-2.2.49}/fixos/config.py +105 -11
  25. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_storage_system_mixin.py +62 -17
  26. fixos-2.2.49/fixos/diagnostics/docker_startup_optimizer.py +560 -0
  27. fixos-2.2.49/fixos/diagnostics/jetbrains_ai.py +294 -0
  28. fixos-2.2.49/fixos/diagnostics/jetbrains_recovery.py +638 -0
  29. fixos-2.2.49/fixos/diagnostics/orphaned_workloads.py +731 -0
  30. fixos-2.2.49/fixos/diagnostics/process_chains.py +594 -0
  31. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/quick_snapshot.py +36 -18
  32. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/service_cleanup.py +267 -64
  33. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/service_scanner.py +99 -38
  34. fixos-2.2.49/fixos/endpoint_refresh.py +200 -0
  35. fixos-2.2.49/fixos/features/data/packages.yaml +316 -0
  36. fixos-2.2.49/fixos/features/data/profiles/developer.yaml +13 -0
  37. fixos-2.2.49/fixos/features/data/profiles/office.yaml +9 -0
  38. fixos-2.2.49/fixos/features/data/profiles/sysadmin.yaml +13 -0
  39. fixos-2.2.49/fixos/orphan_pins.py +155 -0
  40. fixos-2.2.49/fixos/profiles/desktop.yaml +12 -0
  41. fixos-2.2.49/fixos/profiles/developer.yaml +10 -0
  42. fixos-2.2.49/fixos/profiles/minimal.yaml +5 -0
  43. fixos-2.2.49/fixos/profiles/server.yaml +11 -0
  44. {fixos-2.2.47 → fixos-2.2.49}/fixos/providers/llm.py +66 -23
  45. fixos-2.2.49/fixos/utils/anonymizer.py +560 -0
  46. {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/PKG-INFO +6 -6
  47. {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/SOURCES.txt +32 -0
  48. {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/requires.txt +0 -3
  49. {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/top_level.txt +0 -3
  50. {fixos-2.2.47 → fixos-2.2.49}/pyproject.toml +22 -19
  51. {fixos-2.2.47 → fixos-2.2.49}/pytest.ini +2 -1
  52. {fixos-2.2.47 → fixos-2.2.49}/setup.py +1 -1
  53. {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_anonymization_layers.py +39 -16
  54. {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_audio_broken.py +4 -2
  55. {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_multi_system.py +6 -1
  56. fixos-2.2.49/tests/unit/test_anonymizer.py +390 -0
  57. fixos-2.2.49/tests/unit/test_ask_and_nl_group.py +278 -0
  58. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_cleanup_cmd.py +248 -4
  59. fixos-2.2.49/tests/unit/test_cleanup_effectiveness.py +177 -0
  60. fixos-2.2.49/tests/unit/test_cleanup_safety.py +353 -0
  61. fixos-2.2.49/tests/unit/test_cleanup_utils.py +79 -0
  62. fixos-2.2.49/tests/unit/test_core.py +1098 -0
  63. fixos-2.2.49/tests/unit/test_docker_startup_optimizer.py +369 -0
  64. fixos-2.2.49/tests/unit/test_endpoint_refresh.py +169 -0
  65. fixos-2.2.49/tests/unit/test_jetbrains_cmd.py +293 -0
  66. fixos-2.2.49/tests/unit/test_jetbrains_recovery.py +383 -0
  67. fixos-2.2.49/tests/unit/test_llm_auth_stop.py +160 -0
  68. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_llm_provider.py +70 -0
  69. fixos-2.2.49/tests/unit/test_orphan_pins.py +137 -0
  70. fixos-2.2.49/tests/unit/test_orphaned_workloads.py +306 -0
  71. fixos-2.2.49/tests/unit/test_packaging_data.py +57 -0
  72. fixos-2.2.49/tests/unit/test_process_chains.py +300 -0
  73. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_quick_cmd.py +22 -0
  74. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_quick_snapshot.py +30 -0
  75. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_service_cleanup.py +16 -9
  76. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_service_scanner.py +19 -11
  77. fixos-2.2.49/tests/unit/test_shell_ux.py +98 -0
  78. fixos-2.2.49/tests/unit/test_storage_analyzer.py +72 -0
  79. fixos-2.2.47/fixos/agent/hitl_session.py +0 -246
  80. fixos-2.2.47/fixos/agent/session_core.py +0 -245
  81. fixos-2.2.47/fixos/anonymizer.py +0 -80
  82. fixos-2.2.47/fixos/utils/anonymizer.py +0 -356
  83. fixos-2.2.47/tests/unit/test_anonymizer.py +0 -198
  84. fixos-2.2.47/tests/unit/test_core.py +0 -385
  85. {fixos-2.2.47 → fixos-2.2.49}/.env.example +0 -0
  86. {fixos-2.2.47 → fixos-2.2.49}/LICENSE +0 -0
  87. {fixos-2.2.47 → fixos-2.2.49}/docker/README.md +0 -0
  88. {fixos-2.2.47 → fixos-2.2.49}/docker/TEST_RESULTS.md +0 -0
  89. {fixos-2.2.47 → fixos-2.2.49}/docker/TEST_RESULTS_V2.md +0 -0
  90. {fixos-2.2.47 → fixos-2.2.49}/docker/alpine/Dockerfile +0 -0
  91. {fixos-2.2.47 → fixos-2.2.49}/docker/arch/Dockerfile +0 -0
  92. {fixos-2.2.47 → fixos-2.2.49}/docker/base/Dockerfile +0 -0
  93. {fixos-2.2.47 → fixos-2.2.49}/docker/broken-audio/Dockerfile +0 -0
  94. {fixos-2.2.47 → fixos-2.2.49}/docker/broken-full/Dockerfile +0 -0
  95. {fixos-2.2.47 → fixos-2.2.49}/docker/broken-network/Dockerfile +0 -0
  96. {fixos-2.2.47 → fixos-2.2.49}/docker/broken-thumbnails/Dockerfile +0 -0
  97. {fixos-2.2.47 → fixos-2.2.49}/docker/docker-compose.multi-system.yml +0 -0
  98. {fixos-2.2.47 → fixos-2.2.49}/docker/docker-compose.yml +0 -0
  99. {fixos-2.2.47 → fixos-2.2.49}/docker/test-multi-system.sh +0 -0
  100. {fixos-2.2.47 → fixos-2.2.49}/docker/test-scenarios.sh +0 -0
  101. {fixos-2.2.47 → fixos-2.2.49}/docker/validate-scenario.py +0 -0
  102. {fixos-2.2.47 → fixos-2.2.49}/docs/examples/advanced_usage.py +0 -0
  103. {fixos-2.2.47 → fixos-2.2.49}/docs/examples/quickstart.py +0 -0
  104. {fixos-2.2.47 → fixos-2.2.49}/fixos/__main__.py +0 -0
  105. {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/__init__.py +0 -0
  106. {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/autonomous.py +0 -0
  107. {fixos-2.2.47 → fixos-2.2.49}/fixos/agent/hitl.py +0 -0
  108. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/__init__.py +0 -0
  109. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/_cleanup_home.py +0 -0
  110. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/_cleanup_snap.py +0 -0
  111. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/_cleanup_system.py +0 -0
  112. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/config_cmd.py +0 -0
  113. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/features_cmd.py +0 -0
  114. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/fix_cmd.py +0 -0
  115. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/history_cmd.py +0 -0
  116. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/orchestrate_cmd.py +0 -0
  117. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/output_formatter.py +0 -0
  118. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/profile_cmd.py +0 -0
  119. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/projects_cmd.py +0 -0
  120. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/provider_cmd.py +0 -0
  121. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/quickfix_cmd.py +0 -0
  122. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/report_cmd.py +0 -0
  123. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/rollback_cmd.py +0 -0
  124. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/scan_cmd.py +0 -0
  125. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/token_cmd.py +0 -0
  126. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli/watch_cmd.py +0 -0
  127. {fixos-2.2.47 → fixos-2.2.49}/fixos/cli.py +0 -0
  128. {fixos-2.2.47 → fixos-2.2.49}/fixos/config_interactive.py +0 -0
  129. {fixos-2.2.47 → fixos-2.2.49}/fixos/constants.py +0 -0
  130. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/__init__.py +0 -0
  131. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_flatpak_analysis_mixin.py +0 -0
  132. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_flatpak_execution_mixin.py +0 -0
  133. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_flatpak_recommendations_mixin.py +0 -0
  134. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_storage_container_mixin.py +0 -0
  135. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/_storage_user_mixin.py +0 -0
  136. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/cache_discovery.py +0 -0
  137. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/__init__.py +0 -0
  138. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/_shared.py +0 -0
  139. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/audio.py +0 -0
  140. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/file_analysis.py +0 -0
  141. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/hardware.py +0 -0
  142. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/packages.py +0 -0
  143. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/resources.py +0 -0
  144. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/security.py +0 -0
  145. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/storage_optimization.py +0 -0
  146. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/system_core.py +0 -0
  147. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/checks/thumbnails.py +0 -0
  148. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/dev_project_analyzer.py +0 -0
  149. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/disk_analyzer.py +0 -0
  150. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/docker_network_cleanup.py +0 -0
  151. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/flatpak_analyzer.py +0 -0
  152. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/project_scanner.py +0 -0
  153. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/service_details.py +0 -0
  154. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/storage_analyzer.py +0 -0
  155. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/system_checks.py +0 -0
  156. {fixos-2.2.47 → fixos-2.2.49}/fixos/diagnostics/utils.py +0 -0
  157. {fixos-2.2.47 → fixos-2.2.49}/fixos/features/__init__.py +0 -0
  158. {fixos-2.2.47 → fixos-2.2.49}/fixos/features/auditor.py +0 -0
  159. {fixos-2.2.47 → fixos-2.2.49}/fixos/features/catalog.py +0 -0
  160. {fixos-2.2.47 → fixos-2.2.49}/fixos/features/installer.py +0 -0
  161. {fixos-2.2.47 → fixos-2.2.49}/fixos/features/profiles.py +0 -0
  162. {fixos-2.2.47 → fixos-2.2.49}/fixos/features/renderer.py +0 -0
  163. {fixos-2.2.47 → fixos-2.2.49}/fixos/fixes/__init__.py +0 -0
  164. {fixos-2.2.47 → fixos-2.2.49}/fixos/interactive/__init__.py +0 -0
  165. {fixos-2.2.47 → fixos-2.2.49}/fixos/interactive/cleanup_planner.py +0 -0
  166. {fixos-2.2.47 → fixos-2.2.49}/fixos/llm_shell.py +0 -0
  167. {fixos-2.2.47 → fixos-2.2.49}/fixos/orchestrator/__init__.py +0 -0
  168. {fixos-2.2.47 → fixos-2.2.49}/fixos/orchestrator/executor.py +0 -0
  169. {fixos-2.2.47 → fixos-2.2.49}/fixos/orchestrator/graph.py +0 -0
  170. {fixos-2.2.47 → fixos-2.2.49}/fixos/orchestrator/orchestrator.py +0 -0
  171. {fixos-2.2.47 → fixos-2.2.49}/fixos/orchestrator/rollback.py +0 -0
  172. {fixos-2.2.47 → fixos-2.2.49}/fixos/platform_utils.py +0 -0
  173. {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/__init__.py +0 -0
  174. {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/base.py +0 -0
  175. {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/__init__.py +0 -0
  176. {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/audio.py +0 -0
  177. {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/disk.py +0 -0
  178. {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/hardware.py +0 -0
  179. {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/resources.py +0 -0
  180. {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/security.py +0 -0
  181. {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/builtin/thumbnails.py +0 -0
  182. {fixos-2.2.47 → fixos-2.2.49}/fixos/plugins/registry.py +0 -0
  183. {fixos-2.2.47 → fixos-2.2.49}/fixos/profiles/__init__.py +0 -0
  184. {fixos-2.2.47 → fixos-2.2.49}/fixos/providers/__init__.py +0 -0
  185. {fixos-2.2.47 → fixos-2.2.49}/fixos/providers/llm_analyzer.py +0 -0
  186. {fixos-2.2.47 → fixos-2.2.49}/fixos/providers/schemas.py +0 -0
  187. {fixos-2.2.47 → fixos-2.2.49}/fixos/system_checks.py +0 -0
  188. {fixos-2.2.47 → fixos-2.2.49}/fixos/utils/__init__.py +0 -0
  189. {fixos-2.2.47 → fixos-2.2.49}/fixos/utils/terminal.py +0 -0
  190. {fixos-2.2.47 → fixos-2.2.49}/fixos/utils/timeout.py +0 -0
  191. {fixos-2.2.47 → fixos-2.2.49}/fixos/utils/web_search.py +0 -0
  192. {fixos-2.2.47 → fixos-2.2.49}/fixos/watch.py +0 -0
  193. {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/dependency_links.txt +0 -0
  194. {fixos-2.2.47 → fixos-2.2.49}/fixos.egg-info/entry_points.txt +0 -0
  195. {fixos-2.2.47 → fixos-2.2.49}/requirements-dev.txt +0 -0
  196. {fixos-2.2.47 → fixos-2.2.49}/requirements.txt +0 -0
  197. {fixos-2.2.47 → fixos-2.2.49}/scripts/pyqual-calibrate.py +0 -0
  198. {fixos-2.2.47 → fixos-2.2.49}/setup.cfg +0 -0
  199. {fixos-2.2.47 → fixos-2.2.49}/tests/__init__.py +0 -0
  200. {fixos-2.2.47 → fixos-2.2.49}/tests/conftest.py +0 -0
  201. {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/__init__.py +0 -0
  202. {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_cli.py +0 -0
  203. {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_diagnostics_integration.py +0 -0
  204. {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_executor.py +0 -0
  205. {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_network_broken.py +0 -0
  206. {fixos-2.2.47 → fixos-2.2.49}/tests/e2e/test_thumbnails_broken.py +0 -0
  207. {fixos-2.2.47 → fixos-2.2.49}/tests/test_fixos.py +0 -0
  208. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/__init__.py +0 -0
  209. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_cache_discovery.py +0 -0
  210. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_dev_project_analyzer.py +0 -0
  211. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_docker_network_cleanup.py +0 -0
  212. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_executor.py +0 -0
  213. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_orchestrator.py +0 -0
  214. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_project_scanner.py +0 -0
  215. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_projects_cmd.py +0 -0
  216. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_resources_quick.py +0 -0
  217. {fixos-2.2.47 → fixos-2.2.49}/tests/unit/test_security_quick.py +0 -0
  218. {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
@@ -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.47
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
+ ![img3.png](img3.png)
45
45
  ```
46
46
  ___ _ ___ ____
47
47
  / _(_)_ __ / _ \/ ___|
@@ -63,11 +63,11 @@ 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.47-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.85-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-40.8h-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.8536 (152 commits)
70
- - 👤 **Human dev:** ~$4079 (40.8h @ $100/h, 30min dedup)
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
+ ![img3.png](img3.png)
1
2
  ```
2
3
  ___ _ ___ ____
3
4
  / _(_)_ __ / _ \/ ___|
@@ -19,11 +20,11 @@ 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.47-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.85-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-40.8h-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.8536 (152 commits)
26
- - 👤 **Human dev:** ~$4079 (40.8h @ $100/h, 30min dedup)
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
 
@@ -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.47"
3
+ __version__ = "2.2.49"
@@ -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,