machineconfig 3.7__py3-none-any.whl → 7.69__py3-none-any.whl

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.

Potentially problematic release.


This version of machineconfig might be problematic. Click here for more details.

Files changed (465) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/remote/script_execution.py +1 -2
  5. machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
  6. machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +128 -330
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  13. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  14. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  17. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  18. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  19. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  20. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -172
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  23. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  24. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  25. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  26. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  31. machineconfig/jobs/{python → installer}/check_installations.py +7 -21
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/gh.py +128 -0
  34. machineconfig/jobs/{python_custom_installers → installer/custom}/hx.py +84 -18
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +86 -0
  36. machineconfig/jobs/installer/custom_dev/brave.py +82 -0
  37. machineconfig/jobs/installer/custom_dev/bypass_paywall.py +59 -0
  38. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  39. machineconfig/jobs/installer/custom_dev/code.py +63 -0
  40. machineconfig/jobs/{python_custom_installers/dev → installer/custom_dev}/cursor.py +7 -7
  41. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  42. machineconfig/jobs/installer/custom_dev/espanso.py +117 -0
  43. machineconfig/jobs/installer/custom_dev/goes.py +68 -0
  44. machineconfig/jobs/installer/custom_dev/lvim.py +89 -0
  45. machineconfig/jobs/installer/custom_dev/nerdfont.py +111 -0
  46. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +149 -0
  47. machineconfig/jobs/installer/custom_dev/redis.py +88 -0
  48. machineconfig/jobs/installer/custom_dev/sysabc.py +145 -0
  49. machineconfig/jobs/installer/custom_dev/wezterm.py +92 -0
  50. machineconfig/jobs/{python_custom_installers/dev → installer/custom_dev}/winget.py +2 -3
  51. machineconfig/jobs/installer/installer_data.json +3440 -0
  52. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/brave.sh +4 -14
  53. machineconfig/jobs/{python_custom_installers/scripts/linux/warp-cli.sh → installer/linux_scripts/cloudflare_warp_cli.sh} +5 -17
  54. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/docker.sh +6 -18
  55. machineconfig/jobs/installer/linux_scripts/docker_start.sh +37 -0
  56. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/edge.sh +3 -11
  57. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  58. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/nerdfont.sh +5 -17
  59. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  60. machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
  61. machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
  62. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/redis.sh +6 -17
  63. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/vscode.sh +5 -17
  64. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/wezterm.sh +4 -12
  65. machineconfig/jobs/installer/package_groups.py +255 -0
  66. machineconfig/logger.py +0 -1
  67. machineconfig/profile/backup.toml +49 -0
  68. machineconfig/profile/bash_shell_profiles.md +11 -0
  69. machineconfig/profile/create_helper.py +74 -0
  70. machineconfig/profile/create_links.py +288 -0
  71. machineconfig/profile/create_links_export.py +100 -0
  72. machineconfig/profile/create_shell_profile.py +136 -0
  73. machineconfig/profile/mapper.toml +258 -0
  74. machineconfig/scripts/__init__.py +0 -4
  75. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  76. machineconfig/scripts/linux/wrap_mcfg +47 -0
  77. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  78. machineconfig/scripts/python/agents.py +198 -0
  79. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  80. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  81. machineconfig/scripts/python/ai/generate_files.py +307 -42
  82. machineconfig/scripts/python/ai/{mcinit.py → initai.py} +3 -38
  83. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +114 -0
  84. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +88 -22
  85. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  86. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -1
  87. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  88. machineconfig/scripts/python/ai/solutions/gemini/settings.json +1 -1
  89. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  90. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  91. machineconfig/scripts/python/cloud.py +29 -0
  92. machineconfig/scripts/python/croshell.py +129 -198
  93. machineconfig/scripts/python/define.py +31 -0
  94. machineconfig/scripts/python/devops.py +45 -131
  95. machineconfig/scripts/python/devops_navigator.py +6 -0
  96. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  97. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  98. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  99. machineconfig/scripts/python/fire_jobs.py +166 -235
  100. machineconfig/scripts/python/ftpx.py +164 -100
  101. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  102. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  103. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  104. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  106. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  107. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  108. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  109. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
  110. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  111. machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
  112. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  113. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  114. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  115. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +52 -39
  116. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +13 -18
  117. machineconfig/scripts/python/helpers_cloud/cloud_sync.py +81 -0
  118. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
  119. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  120. machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -1
  121. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +32 -20
  122. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  123. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  124. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  125. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  126. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  127. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  128. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  129. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  130. machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
  131. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  132. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  133. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  134. machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
  135. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  136. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  137. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  138. machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -2
  139. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -89
  140. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
  141. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -0
  142. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  143. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  144. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  145. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  146. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  147. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  148. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  149. machineconfig/scripts/python/helpers_navigator/command_tree.py +620 -0
  150. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  151. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  152. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  153. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  154. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  155. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +6 -7
  156. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  157. machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
  158. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  159. machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
  160. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  161. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
  162. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  163. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  164. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  165. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  166. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  167. machineconfig/scripts/python/interactive.py +187 -0
  168. machineconfig/scripts/python/mcfg_entry.py +63 -0
  169. machineconfig/scripts/python/msearch.py +40 -0
  170. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
  171. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
  172. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  173. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
  174. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  175. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
  176. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  177. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  178. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  179. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -51
  180. machineconfig/scripts/python/nw/wsl_windows_transfer.py +67 -0
  181. machineconfig/scripts/python/sessions.py +167 -0
  182. machineconfig/scripts/python/terminal.py +127 -0
  183. machineconfig/scripts/python/utils.py +66 -0
  184. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
  185. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  186. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  187. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  188. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  189. machineconfig/settings/broot/br.sh +0 -4
  190. machineconfig/settings/broot/conf.toml +1 -1
  191. machineconfig/settings/helix/config.toml +16 -0
  192. machineconfig/settings/helix/languages.toml +13 -4
  193. machineconfig/settings/helix/yazi-picker.sh +12 -0
  194. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  195. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  196. machineconfig/settings/lf/linux/lfrc +10 -12
  197. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  198. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  199. machineconfig/settings/lf/windows/lfrc +18 -38
  200. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  201. machineconfig/settings/linters/.ruff.toml +1 -1
  202. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  203. machineconfig/settings/marimo/marimo.toml +80 -0
  204. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  205. machineconfig/settings/pistol/pistol.conf +1 -1
  206. machineconfig/settings/shells/bash/init.sh +55 -31
  207. machineconfig/settings/shells/nushell/config.nu +1 -34
  208. machineconfig/settings/shells/nushell/init.nu +127 -0
  209. machineconfig/settings/shells/pwsh/init.ps1 +61 -43
  210. machineconfig/settings/shells/starship/starship.toml +16 -0
  211. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  212. machineconfig/settings/shells/wt/settings.json +32 -17
  213. machineconfig/settings/shells/zsh/init.sh +89 -0
  214. machineconfig/settings/svim/linux/init.toml +0 -4
  215. machineconfig/settings/svim/windows/init.toml +0 -3
  216. machineconfig/settings/yazi/init.lua +57 -0
  217. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  218. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  219. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  220. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  221. machineconfig/settings/yazi/yazi.toml +14 -1
  222. machineconfig/setup_linux/__init__.py +10 -0
  223. machineconfig/setup_linux/apps_desktop.sh +89 -0
  224. machineconfig/setup_linux/apps_gui.sh +64 -0
  225. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  226. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  227. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  228. machineconfig/setup_linux/uv.sh +15 -0
  229. machineconfig/setup_linux/web_shortcuts/interactive.sh +28 -203
  230. machineconfig/setup_mac/__init__.py +16 -0
  231. machineconfig/setup_mac/apps_gui.sh +248 -0
  232. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  233. machineconfig/setup_mac/uv.sh +36 -0
  234. machineconfig/setup_windows/__init__.py +8 -0
  235. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  236. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  237. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  238. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  239. machineconfig/setup_windows/uv.ps1 +17 -0
  240. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -189
  241. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  242. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
  243. machineconfig/utils/accessories.py +52 -12
  244. machineconfig/utils/cloud/onedrive/README.md +139 -0
  245. machineconfig/utils/code.py +140 -93
  246. machineconfig/utils/files/art/fat_croco.txt +10 -0
  247. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  248. machineconfig/utils/files/art/happy_croco.txt +22 -0
  249. machineconfig/utils/files/art/water_croco.txt +11 -0
  250. machineconfig/utils/files/ascii_art.py +118 -0
  251. machineconfig/utils/files/dbms.py +257 -0
  252. machineconfig/utils/files/headers.py +68 -0
  253. machineconfig/utils/files/ouch/decompress.py +45 -0
  254. machineconfig/utils/files/read.py +95 -0
  255. machineconfig/utils/installer_utils/github_release_bulk.py +188 -0
  256. machineconfig/utils/installer_utils/install_from_url.py +180 -0
  257. machineconfig/utils/installer_utils/installer_class.py +239 -316
  258. machineconfig/utils/installer_utils/installer_cli.py +186 -0
  259. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +90 -5
  260. machineconfig/utils/installer_utils/installer_runner.py +191 -0
  261. machineconfig/utils/io.py +77 -24
  262. machineconfig/utils/links.py +309 -100
  263. machineconfig/utils/meta.py +255 -0
  264. machineconfig/utils/notifications.py +1 -1
  265. machineconfig/utils/options.py +19 -47
  266. machineconfig/utils/path_extended.py +111 -121
  267. machineconfig/utils/path_helper.py +75 -22
  268. machineconfig/utils/procs.py +50 -74
  269. machineconfig/utils/scheduler.py +94 -97
  270. machineconfig/utils/scheduling.py +0 -3
  271. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
  272. machineconfig/utils/schemas/installer/installer_types.py +28 -6
  273. machineconfig/utils/schemas/layouts/layout_types.py +34 -1
  274. machineconfig/utils/source_of_truth.py +3 -6
  275. machineconfig/utils/ssh.py +742 -254
  276. machineconfig/utils/ssh_utils/utils.py +0 -0
  277. machineconfig/utils/terminal.py +3 -140
  278. machineconfig/utils/tst.py +20 -0
  279. machineconfig/utils/upgrade_packages.py +109 -28
  280. machineconfig/utils/ve.py +13 -5
  281. machineconfig-7.69.dist-info/METADATA +124 -0
  282. machineconfig-7.69.dist-info/RECORD +454 -0
  283. machineconfig-7.69.dist-info/entry_points.txt +15 -0
  284. machineconfig/cluster/templates/cli_click.py +0 -102
  285. machineconfig/cluster/templates/cli_gooey.py +0 -115
  286. machineconfig/cluster/templates/utils.py +0 -51
  287. machineconfig/jobs/linux/msc/cli_agents.sh +0 -32
  288. machineconfig/jobs/python/create_bootable_media.py +0 -16
  289. machineconfig/jobs/python/python_cargo_build_share.py +0 -59
  290. machineconfig/jobs/python/python_ve_symlink.py +0 -29
  291. machineconfig/jobs/python/tasks.py +0 -3
  292. machineconfig/jobs/python/vscode/api.py +0 -48
  293. machineconfig/jobs/python/vscode/link_ve.py +0 -63
  294. machineconfig/jobs/python/vscode/select_interpreter.py +0 -87
  295. machineconfig/jobs/python/vscode/sync_code.py +0 -58
  296. machineconfig/jobs/python_custom_installers/archive/ngrok.py +0 -63
  297. machineconfig/jobs/python_custom_installers/dev/aider.py +0 -37
  298. machineconfig/jobs/python_custom_installers/dev/alacritty.py +0 -65
  299. machineconfig/jobs/python_custom_installers/dev/brave.py +0 -71
  300. machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +0 -50
  301. machineconfig/jobs/python_custom_installers/dev/code.py +0 -51
  302. machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +0 -78
  303. machineconfig/jobs/python_custom_installers/dev/espanso.py +0 -90
  304. machineconfig/jobs/python_custom_installers/dev/goes.py +0 -55
  305. machineconfig/jobs/python_custom_installers/dev/lvim.py +0 -77
  306. machineconfig/jobs/python_custom_installers/dev/nerdfont.py +0 -68
  307. machineconfig/jobs/python_custom_installers/dev/redis.py +0 -65
  308. machineconfig/jobs/python_custom_installers/dev/reverse_proxy.md +0 -31
  309. machineconfig/jobs/python_custom_installers/dev/wezterm.py +0 -70
  310. machineconfig/jobs/python_custom_installers/docker.py +0 -74
  311. machineconfig/jobs/python_custom_installers/gh.py +0 -97
  312. machineconfig/jobs/python_custom_installers/scripts/linux/docker_start.sh +0 -45
  313. machineconfig/jobs/python_custom_installers/scripts/linux/pgsql.sh +0 -49
  314. machineconfig/jobs/python_custom_installers/scripts/linux/timescaledb.sh +0 -85
  315. machineconfig/jobs/python_custom_installers/warp-cli.py +0 -71
  316. machineconfig/jobs/python_generic_installers/config.json +0 -603
  317. machineconfig/jobs/python_generic_installers/config.json.bak +0 -414
  318. machineconfig/jobs/python_generic_installers/dev/config.archive.json +0 -18
  319. machineconfig/jobs/python_generic_installers/dev/config.json +0 -825
  320. machineconfig/jobs/python_generic_installers/dev/config.json.bak +0 -565
  321. machineconfig/jobs/python_linux_installers/archive/config.json +0 -18
  322. machineconfig/jobs/python_linux_installers/archive/config.json.bak +0 -10
  323. machineconfig/jobs/python_linux_installers/config.json +0 -145
  324. machineconfig/jobs/python_linux_installers/config.json.bak +0 -110
  325. machineconfig/jobs/python_linux_installers/dev/config.json +0 -276
  326. machineconfig/jobs/python_linux_installers/dev/config.json.bak +0 -206
  327. machineconfig/jobs/python_windows_installers/archive/file.json +0 -11
  328. machineconfig/jobs/python_windows_installers/config.json +0 -82
  329. machineconfig/jobs/python_windows_installers/config.json.bak +0 -56
  330. machineconfig/jobs/python_windows_installers/dev/config.json +0 -4
  331. machineconfig/jobs/python_windows_installers/dev/config.json.bak +0 -3
  332. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  333. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  334. machineconfig/jobs/windows/startup_file.cmd +0 -2
  335. machineconfig/profile/create.py +0 -169
  336. machineconfig/profile/shell.py +0 -176
  337. machineconfig/scripts/cloud/init.sh +0 -119
  338. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  339. machineconfig/scripts/linux/cloud_copy +0 -2
  340. machineconfig/scripts/linux/cloud_mount +0 -2
  341. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  342. machineconfig/scripts/linux/cloud_sync +0 -2
  343. machineconfig/scripts/linux/croshell +0 -3
  344. machineconfig/scripts/linux/devops +0 -2
  345. machineconfig/scripts/linux/fire +0 -2
  346. machineconfig/scripts/linux/fire_agents +0 -2
  347. machineconfig/scripts/linux/ftpx +0 -2
  348. machineconfig/scripts/linux/fzf2g +0 -21
  349. machineconfig/scripts/linux/fzffg +0 -25
  350. machineconfig/scripts/linux/gh_models +0 -2
  351. machineconfig/scripts/linux/kill_process +0 -2
  352. machineconfig/scripts/linux/mcinit +0 -2
  353. machineconfig/scripts/linux/programs +0 -21
  354. machineconfig/scripts/linux/repos +0 -2
  355. machineconfig/scripts/linux/scheduler +0 -2
  356. machineconfig/scripts/linux/share_smb +0 -1
  357. machineconfig/scripts/linux/start_slidev +0 -2
  358. machineconfig/scripts/linux/start_terminals +0 -3
  359. machineconfig/scripts/linux/warp-cli.sh +0 -122
  360. machineconfig/scripts/linux/wifi_conn +0 -2
  361. machineconfig/scripts/linux/z_ls +0 -104
  362. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  363. machineconfig/scripts/python/archive/im2text.py +0 -34
  364. machineconfig/scripts/python/archive/tmate_conn.py +0 -41
  365. machineconfig/scripts/python/archive/tmate_start.py +0 -44
  366. machineconfig/scripts/python/cloud_repo_sync.py +0 -192
  367. machineconfig/scripts/python/cloud_sync.py +0 -85
  368. machineconfig/scripts/python/devops_devapps_install.py +0 -202
  369. machineconfig/scripts/python/devops_update_repos.py +0 -180
  370. machineconfig/scripts/python/dotfile.py +0 -52
  371. machineconfig/scripts/python/fire_agents.py +0 -176
  372. machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
  373. machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
  374. machineconfig/scripts/python/fire_jobs_args_helper.py +0 -84
  375. machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -66
  376. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  377. machineconfig/scripts/python/gh_models.py +0 -104
  378. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -114
  379. machineconfig/scripts/python/repos.py +0 -160
  380. machineconfig/scripts/python/snapshot.py +0 -25
  381. machineconfig/scripts/python/start_terminals.py +0 -121
  382. machineconfig/scripts/python/wsl_windows_transfer.py +0 -72
  383. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  384. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  385. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  386. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  387. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  388. machineconfig/scripts/windows/croshell.ps1 +0 -1
  389. machineconfig/scripts/windows/devops.ps1 +0 -1
  390. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  391. machineconfig/scripts/windows/fire.ps1 +0 -1
  392. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  393. machineconfig/scripts/windows/gpt.ps1 +0 -1
  394. machineconfig/scripts/windows/grep.ps1 +0 -2
  395. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  396. machineconfig/scripts/windows/mcinit.ps1 +0 -1
  397. machineconfig/scripts/windows/nano.ps1 +0 -3
  398. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  399. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  400. machineconfig/scripts/windows/repos.ps1 +0 -1
  401. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  402. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  403. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  404. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  405. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  406. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  407. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  408. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  409. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  410. machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
  411. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  412. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  413. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  414. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  415. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  416. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  417. machineconfig/setup_windows/wt_and_pwsh/install_nerd_fonts.py +0 -100
  418. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  419. machineconfig/utils/installer.py +0 -255
  420. machineconfig-3.7.dist-info/METADATA +0 -165
  421. machineconfig-3.7.dist-info/RECORD +0 -432
  422. machineconfig-3.7.dist-info/entry_points.txt +0 -18
  423. machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
  424. machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
  425. machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
  426. machineconfig/jobs/{python → installer}/__init__.py +0 -0
  427. machineconfig/jobs/{python_custom_installers → installer/custom_dev}/__init__.py +0 -0
  428. machineconfig/{setup_windows/wt_and_pwsh → jobs/installer/powershell_scripts}/install_fonts.ps1 +0 -0
  429. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  430. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  431. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  432. machineconfig/{jobs/python_generic_installers → scripts/python/helpers_agents}/__init__.py +0 -0
  433. machineconfig/{jobs/python_linux_installers → scripts/python/helpers_agents/agentic_frameworks}/__init__.py +0 -0
  434. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  435. machineconfig/{jobs/python_linux_installers/dev → scripts/python/helpers_cloud}/__init__.py +0 -0
  436. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  437. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  438. /machineconfig/{jobs/python_windows_installers → scripts/python/helpers_croshell}/__init__.py +0 -0
  439. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  440. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  441. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  442. /machineconfig/{jobs/python_windows_installers/archive → scripts/python/helpers_devops}/__init__.py +0 -0
  443. /machineconfig/{jobs/python_windows_installers/dev → scripts/python/helpers_devops/themes}/__init__.py +0 -0
  444. /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  445. /machineconfig/scripts/python/{helpers → helpers_fire_command}/__init__.py +0 -0
  446. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_fire_command/fire_jobs_streamlit_helper.py} +0 -0
  447. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  448. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  449. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  450. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  451. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_sessions/__init__.py} +0 -0
  452. /machineconfig/scripts/{windows/share_nfs.ps1 → python/nw/__init__.py} +0 -0
  453. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  454. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  455. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  456. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  457. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  458. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  459. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  460. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  461. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  462. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  463. /machineconfig/{settings/yazi/keymap.toml → utils/files/ouch/__init__.py} +0 -0
  464. {machineconfig-3.7.dist-info → machineconfig-7.69.dist-info}/WHEEL +0 -0
  465. {machineconfig-3.7.dist-info → machineconfig-7.69.dist-info}/top_level.txt +0 -0
@@ -2,12 +2,11 @@
2
2
 
3
3
  import psutil
4
4
  from rich.progress import Progress, SpinnerColumn, TextColumn
5
- from zoneinfo import ZoneInfo
6
5
  from machineconfig.utils.options import choose_from_options
7
- from typing import Optional, Any
6
+ from typing import Optional, TypedDict, List, Dict
8
7
  from rich.console import Console
9
8
  from rich.panel import Panel
10
- from datetime import datetime, timezone
9
+ from datetime import datetime
11
10
  from machineconfig.utils.accessories import pprint
12
11
 
13
12
  console = Console()
@@ -15,11 +14,29 @@ console = Console()
15
14
  BOX_WIDTH = 78 # width for box drawing
16
15
 
17
16
 
18
- def get_processes_accessing_file(path: str):
17
+ class ProcessInfo(TypedDict):
18
+ """TypedDict for process information."""
19
+ command: str
20
+ pid: int
21
+ name: str
22
+ username: str
23
+ cpu_percent: float
24
+ memory_usage_mb: float
25
+ status: str
26
+ create_time: datetime
27
+
28
+
29
+ class FileAccessInfo(TypedDict):
30
+ """TypedDict for file access information."""
31
+ pid: int
32
+ files: List[str]
33
+
34
+
35
+ def get_processes_accessing_file(path: str) -> List[FileAccessInfo]:
19
36
  # header for searching processes
20
37
  title = "🔍 SEARCHING FOR PROCESSES ACCESSING FILE"
21
38
  console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
22
- res: dict[int, list[str]] = {}
39
+ res: Dict[int, List[str]] = {}
23
40
 
24
41
  with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
25
42
  progress.add_task("🔎 Scanning processes...", total=None)
@@ -34,22 +51,22 @@ def get_processes_accessing_file(path: str):
34
51
  res[proc.pid] = tmp
35
52
 
36
53
  # Convert to list of dictionaries for consistent data structure
37
- result_data = [{"pid": pid, "files": files} for pid, files in res.items()]
54
+ result_data: List[FileAccessInfo] = [{"pid": pid, "files": files} for pid, files in res.items()]
38
55
  console.print(Panel(f"✅ Found {len(res)} processes accessing the specified file", title="[bold blue]Process Info[/bold blue]", border_style="blue"))
39
56
  return result_data
40
57
 
41
58
 
42
59
  def kill_process(name: str):
43
- print(f"⚠️ Attempting to kill process: {name}...")
60
+ console.print(f"⚠️ Attempting to kill process: {name}...", style="yellow")
44
61
  killed = False
45
62
  for proc in psutil.process_iter():
46
63
  if proc.name() == name:
47
64
  proc.kill()
48
- print(f"💀 Process {name} (PID: {proc.pid}) terminated successfully")
65
+ console.print(f"💀 Process {name} (PID: {proc.pid}) terminated successfully", style="green")
49
66
  killed = True
50
67
  if not killed:
51
- print(f"❓ No process with name '{name}' was found")
52
- print(f"{'─' * 80}\n")
68
+ console.print(f"❓ No process with name '{name}' was found", style="red")
69
+ console.rule(style="dim")
53
70
 
54
71
 
55
72
  class ProcessManager:
@@ -57,17 +74,13 @@ class ProcessManager:
57
74
  # header for initializing process manager
58
75
  title = "📊 INITIALIZING PROCESS MANAGER"
59
76
  console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
60
- process_info = []
61
-
77
+ process_info: List[ProcessInfo] = []
62
78
  with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
63
79
  progress.add_task("🔍 Reading system processes...", total=None)
64
-
65
80
  for proc in psutil.process_iter():
66
81
  try:
67
82
  mem_usage_mb = proc.memory_info().rss / (1024 * 1024)
68
- # Convert create_time to local timezone
69
- create_time_utc = datetime.fromtimestamp(proc.create_time(), tz=timezone.utc)
70
- create_time_local = create_time_utc.astimezone(ZoneInfo("Australia/Adelaide"))
83
+ create_time = datetime.fromtimestamp(proc.create_time(), tz=None)
71
84
 
72
85
  process_info.append(
73
86
  {
@@ -77,7 +90,7 @@ class ProcessManager:
77
90
  "cpu_percent": proc.cpu_percent(),
78
91
  "memory_usage_mb": mem_usage_mb,
79
92
  "status": proc.status(),
80
- "create_time": create_time_local,
93
+ "create_time": create_time,
81
94
  "command": " ".join(proc.cmdline()),
82
95
  }
83
96
  )
@@ -93,57 +106,51 @@ class ProcessManager:
93
106
  """Format process data as table string for display."""
94
107
  if not self.data:
95
108
  return ""
96
-
97
109
  # Create header
98
- _headers = ["PID", "Name", "Username", "CPU%", "Memory(MB)", "Status", "Create Time", "Command"]
99
- header_line = f"{'PID':<8} {'Name':<20} {'Username':<12} {'CPU%':<8} {'Memory(MB)':<12} {'Status':<12} {'Create Time':<20} {'Command':<50}"
110
+ _headers = ["Command", "PID", "Name", "Username", "CPU%", "Memory(MB)", "Status", "Create Time"]
111
+ header_line = f"{'Command':<50} {'PID':<8} {'Name':<20} {'Username':<12} {'CPU%':<8} {'Memory(MB)':<12} {'Status':<12} {'Create Time':<20}"
100
112
  separator = "-" * len(header_line)
101
-
102
113
  lines = [header_line, separator]
103
-
104
114
  for process in self.data:
105
115
  # Format create_time as string
106
116
  create_time_str = process["create_time"].strftime("%Y-%m-%d %H:%M:%S")
107
117
  # Truncate command if too long
108
118
  command = process["command"][:47] + "..." if len(process["command"]) > 50 else process["command"]
109
-
110
- line = f"{process['pid']:<8} {process['name'][:19]:<20} {process['username'][:11]:<12} {process['cpu_percent']:<8.1f} {process['memory_usage_mb']:<12.2f} {process['status'][:11]:<12} {create_time_str:<20} {command:<50}"
119
+ line = f"{command:<50} {process['pid']:<8} {process['name'][:19]:<20} {process['username'][:11]:<12} {process['cpu_percent']:<8.1f} {process['memory_usage_mb']:<12.2f} {process['status'][:11]:<12} {create_time_str:<20}"
111
120
  lines.append(line)
112
-
113
121
  return "\n".join(lines)
114
122
 
115
123
  def choose_and_kill(self):
116
124
  # header for interactive process selection
117
125
  title = "🎯 INTERACTIVE PROCESS SELECTION AND TERMINATION"
118
126
  console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
119
-
120
127
  # Format data as table for display
121
128
  formatted_data = self._format_process_table()
122
- options = formatted_data.split("\n")[1:] # Skip header
123
- res = choose_from_options(options=formatted_data.split("\n"), msg="📋 Select processes to manage:", fzf=True, multi=True)
124
- indices = [options.index(val) for val in res]
129
+ all_lines = formatted_data.split("\n")
130
+ header_and_separator = all_lines[:2] # First two lines: header and separator
131
+ options = all_lines[2:] # Skip header and separator, only process lines
132
+ res = choose_from_options(options=all_lines, msg="📋 Select processes to manage:", fzf=True, multi=True)
133
+ # Filter out header and separator if they were selected
134
+ selected_lines = [line for line in res if line not in header_and_separator]
135
+ indices = [options.index(val) for val in selected_lines]
125
136
  selected_processes = [self.data[i] for i in indices]
126
-
127
137
  print("\n📊 All Processes:")
128
138
  print(formatted_data)
129
139
  print("\n🎯 Selected Processes:")
130
140
  for process in selected_processes:
131
141
  print(f"PID: {process['pid']}, Name: {process['name']}, Memory: {process['memory_usage_mb']:.2f}MB")
132
-
133
142
  for idx, process in enumerate(selected_processes):
134
- pprint(process, f"📌 Process {idx}")
135
-
143
+ pprint(dict(process), f"📌 Process {idx}")
136
144
  kill_all = input("\n⚠️ Confirm killing ALL selected processes? y/[n] ").lower() == "y"
137
145
  if kill_all:
138
146
  self.kill(pids=[p["pid"] for p in selected_processes])
139
147
  return
140
-
141
148
  kill_by_index = input("\n🔫 Kill by index? (enter numbers separated by spaces, e.g. '1 4') or [n] to cancel: ")
142
149
  if kill_by_index != "" and kill_by_index != "n":
143
150
  indices = [int(val) for val in kill_by_index.split(" ")]
144
151
  target_processes = [selected_processes[i] for i in indices]
145
152
  for idx2, process in enumerate(target_processes):
146
- pprint(process, f"🎯 Target Process {idx2}")
153
+ pprint(dict(process), f"🎯 Target Process {idx2}")
147
154
  _ = self.kill(pids=[p["pid"] for p in target_processes]) if input("\n⚠️ Confirm termination? y/[n] ").lower() == "y" else None
148
155
  console.print(Panel("🔔 No processes were terminated.", title="[bold blue]Process Info[/bold blue]", border_style="blue"))
149
156
 
@@ -151,18 +158,15 @@ class ProcessManager:
151
158
  # header for filtering processes by name
152
159
  title = "🔍 FILTERING AND TERMINATING PROCESSES BY NAME"
153
160
  console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
154
-
155
161
  # Filter processes by name
156
162
  filtered_processes = [p for p in self.data if p["name"] == name]
157
163
  # Sort by create_time (ascending)
158
164
  filtered_processes.sort(key=lambda x: x["create_time"])
159
-
160
165
  print(f"🎯 Found {len(filtered_processes)} processes matching name: '{name}'")
161
166
  self.kill(pids=[p["pid"] for p in filtered_processes])
162
167
  console.print(Panel("", title="[bold blue]Process Info[/bold blue]", border_style="blue"))
163
168
 
164
169
  def kill(self, names: Optional[list[str]] = None, pids: Optional[list[int]] = None, commands: Optional[list[str]] = None):
165
- # header for process termination
166
170
  title = "💀 PROCESS TERMINATION"
167
171
  console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
168
172
  if names is None and pids is None and commands is None:
@@ -174,74 +178,46 @@ class ProcessManager:
174
178
  pids = []
175
179
  if commands is None:
176
180
  commands = []
177
-
178
181
  killed_count = 0
179
-
180
182
  for name in names:
181
183
  matching_processes = [p for p in self.data if p["name"] == name]
182
184
  if len(matching_processes) > 0:
183
185
  for process in matching_processes:
184
186
  psutil.Process(process["pid"]).kill()
185
- print(f"💀 Killed process {name} with PID {process['pid']}. It lived {get_age(process['create_time'])}. RIP 🪦💐")
187
+ print(f"💀 Killed process {name} with PID {process['pid']}. It lived {get_age(process['create_time'])}. RIP 💐")
186
188
  killed_count += 1
187
189
  else:
188
190
  print(f'❓ No process named "{name}" found')
189
-
190
191
  for pid in pids:
191
192
  try:
192
193
  proc = psutil.Process(pid)
193
194
  proc_name = proc.name()
194
- proc_lifetime = get_age(proc.create_time())
195
+ proc_lifetime = get_age(datetime.fromtimestamp(proc.create_time(), tz=None))
195
196
  proc.kill()
196
- print(f'💀 Killed process with PID {pid} and name "{proc_name}". It lived {proc_lifetime}. RIP 🪦💐')
197
+ print(f'💀 Killed process with PID {pid} and name "{proc_name}". It lived {proc_lifetime}. RIP 💐')
197
198
  killed_count += 1
198
199
  except psutil.NoSuchProcess:
199
200
  print(f"❓ No process with PID {pid} found")
200
-
201
201
  for command in commands:
202
202
  matching_processes = [p for p in self.data if command in p["command"]]
203
203
  if len(matching_processes) > 0:
204
204
  for process in matching_processes:
205
205
  psutil.Process(process["pid"]).kill()
206
- print(f'💀 Killed process with "{command}" in its command & PID {process["pid"]}. It lived {get_age(process["create_time"])}. RIP 🪦💐')
206
+ print(f'💀 Killed process with "{command}" in its command & PID {process["pid"]}. It lived {get_age(process["create_time"])}. RIP 💐')
207
207
  killed_count += 1
208
208
  else:
209
209
  print(f'❓ No process has "{command}" in its command.')
210
-
211
210
  console.print(Panel(f"✅ Termination complete: {killed_count} processes terminated", title="[bold blue]Process Info[/bold blue]", border_style="blue"))
212
211
 
213
212
 
214
- def get_age(create_time: Any) -> str:
215
- """Calculate age from create_time which can be either float timestamp or datetime object."""
216
- try:
217
- if isinstance(create_time, (int, float)):
218
- # Handle timestampz
219
- create_time_utc = datetime.fromtimestamp(create_time, tz=timezone.utc)
220
- create_time_local = create_time_utc.astimezone(ZoneInfo("Australia/Adelaide"))
221
- else:
222
- # Already a datetime object
223
- create_time_local = create_time
224
-
225
- now_local = datetime.now(tz=ZoneInfo("Australia/Adelaide"))
226
- age = now_local - create_time_local
227
- return str(age)
228
- except Exception as e:
229
- try:
230
- # Fallback without timezone
231
- if isinstance(create_time, (int, float)):
232
- create_time_dt = datetime.fromtimestamp(create_time)
233
- else:
234
- create_time_dt = create_time.replace(tzinfo=None) if create_time.tzinfo else create_time
235
- now_dt = datetime.now()
236
- age = now_dt - create_time_dt
237
- return str(age)
238
- except Exception as ee:
239
- return f"unknown due to {ee} and {e}"
213
+ def get_age(create_time: datetime) -> str:
214
+ dtm_now = datetime.now()
215
+ delta = dtm_now - create_time
216
+ return str(delta).split(".")[0] # remove microseconds
240
217
 
241
218
 
242
219
  def main():
243
220
  from machineconfig.utils.procs import ProcessManager
244
-
245
221
  ProcessManager().choose_and_kill()
246
222
 
247
223
 
@@ -1,10 +1,10 @@
1
+
1
2
  from pathlib import Path
2
- from typing import Callable, Optional, Union, Any, NoReturn, TypeVar, Protocol, List, Generic
3
+ from typing import Callable, Optional, Union, Any, Protocol, List, TypeVar
3
4
  import logging
4
5
  import time
5
6
  from datetime import datetime, timezone, timedelta
6
7
  from machineconfig.utils.io import from_pickle
7
- from machineconfig.utils.path_extended import PathExtended as PathExtended
8
8
 
9
9
 
10
10
  class LoggerTemplate(Protocol):
@@ -143,145 +143,142 @@ class Scheduler:
143
143
  raise ex
144
144
 
145
145
 
146
- T = TypeVar("T")
146
+ # T = TypeVar("T")
147
147
  T2 = TypeVar("T2")
148
-
149
-
150
- class PrintFunc(Protocol):
151
- def __call__(self, msg: str) -> Union[NoReturn, None]: ...
152
-
153
-
154
148
  def to_pickle(obj: Any, path: Path) -> None:
155
149
  import pickle
156
-
157
- path.parent.mkdir(parents=True, exist_ok=True)
158
150
  path.write_bytes(pickle.dumps(obj))
159
151
 
160
152
 
161
- class Cache(Generic[T]): # This class helps to accelrate access to latest data coming from expensive function. The class has two flavours, memory-based and disk-based variants."""
162
- # source_func: Callable[[], T]
153
+ class CacheMemory[T]():
154
+ def __init__(
155
+ self, source_func: Callable[[], T], expire: timedelta, logger: LoggerTemplate, name: Optional[str] = None
156
+ ) -> None:
157
+ self.cache: T
158
+ self.source_func = source_func
159
+ self.time_produced = datetime.now()
160
+ self.logger = logger
161
+ self.expire = expire
162
+ self.name = name if isinstance(name, str) else self.source_func.__name__
163
+ def __call__(self, fresh: bool, tolerance_seconds: float | int) -> T:
164
+ if fresh or not hasattr(self, "cache"):
165
+ why = "There was an explicit fresh order." if fresh else "Previous cache never existed."
166
+ t0 = time.time()
167
+ self.logger.warning(f"""
168
+ 🆕 ════════════════════ NEW {self.name} CACHE ════════════════════
169
+ ℹ️ Reason: {why}""")
170
+ self.cache = self.source_func()
171
+ self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
172
+ self.time_produced = datetime.now()
173
+ else:
174
+ age = datetime.now() - self.time_produced
175
+ if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)):
176
+ self.logger.warning(f"""
177
+ 🔄 ════════════════════ CACHE UPDATE ════════════════════
178
+ ⚠️ {self.name} cache: Updating cache from source func
179
+ ⏱️ Age = {age} > {self.expire}""")
180
+ t0 = time.time()
181
+ self.cache = self.source_func()
182
+ self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
183
+ self.time_produced = datetime.now()
184
+ else:
185
+ self.logger.warning(f"""
186
+ ✅ ════════════════════ USING CACHE ════════════════════
187
+ 📦 {self.name} cache: Using cached values
188
+ ⏱️ Lag = {age}""")
189
+ return self.cache
190
+
191
+ @staticmethod
192
+ def as_decorator(expire: timedelta, logger: LoggerTemplate, name: Optional[str] = None):
193
+ def decorator(source_func: Callable[[], T2]) -> CacheMemory["T2"]:
194
+ res = CacheMemory(source_func=source_func, expire=expire, logger=logger, name=name)
195
+ return res
196
+ return decorator
197
+
198
+
199
+ class Cache[T](): # This class helps to accelrate access to latest data coming from expensive function. The class has two flavours, memory-based and disk-based variants."""
163
200
  def __init__(
164
- self, source_func: Callable[[], T], expire: timedelta, logger: Optional[PrintFunc] = None, path: Optional[Path] = None, saver: Callable[[T, Path], Any] = to_pickle, reader: Callable[[Path], T] = from_pickle, name: Optional[str] = None
201
+ self, source_func: Callable[[], T], expire: timedelta, logger: LoggerTemplate, path: Path, saver: Callable[[T, Path], Any] = to_pickle, reader: Callable[[Path], T] = from_pickle, name: Optional[str] = None
165
202
  ) -> None:
166
203
  self.cache: T
167
204
  self.source_func = source_func # function which when called returns a fresh object to be frozen.
168
- self.path: Optional[PathExtended] = PathExtended(path) if path is not None else None # if path is passed, it will function as disk-based flavour.
205
+ self.path: Path = path
206
+ _ = self.path.parent.mkdir(parents=True, exist_ok=True)
169
207
  self.time_produced = datetime.now() # if path is None else
170
208
  self.save = saver
171
209
  self.reader = reader
172
210
  self.logger = logger
173
211
  self.expire = expire
174
- self.name = name if isinstance(name, str) else str(self.source_func)
175
- self.last_call_is_fresh = False
176
-
177
- @property
178
- def age(self):
179
- """Throws AttributeError if called before cache is populated and path doesn't exists"""
180
- if self.path is None: # memory-based cache.
181
- return datetime.now() - self.time_produced
182
- return datetime.now() - datetime.fromtimestamp(self.path.stat().st_mtime)
183
-
184
- # def __setstate__(self, state: dict[str, Any]) -> None:
185
- # self.__dict__.update(state)
186
- # self.path = P.home() / self.path if self.path is not None else self.path
187
- # def __getstate__(self) -> dict[str, Any]:
188
- # state = self.__dict__.copy()
189
- # state["path"] = self.path.rel2home() if self.path is not None else state["path"]
190
- # return state # With this implementation, instances can be pickled and loaded up in different machine and still works.
191
- def __call__(self, fresh: bool = False) -> T:
192
- self.last_call_is_fresh = False
193
- if fresh or not hasattr(self, "cache"): # populate cache for the first time
194
- if not fresh and self.path is not None and self.path.exists():
212
+ self.name = name if isinstance(name, str) else self.source_func.__name__
213
+ def __call__(self, fresh: bool, tolerance_seconds: float | int) -> T:
214
+ if not hasattr(self, "cache"): # populate cache for the first time: we have two options, populate from disk or from source func.
215
+ if self.path.exists(): # prefer to read from disk over source func as a default source of cache.
195
216
  age = datetime.now() - datetime.fromtimestamp(self.path.stat().st_mtime)
217
+ if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)): # cache is old or if fresh flag is raised
218
+ self.logger.warning(f"""
219
+ 🔄 ════════════════════ CACHE STALE ════════════════════
220
+ 📦 {self.name} cache: Populating fresh cache from source func
221
+ ⏱️ Lag = {age}""")
222
+ t0 = time.time()
223
+ self.cache = self.source_func() # fresh data.
224
+ self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
225
+ self.time_produced = datetime.now()
226
+ self.save(self.cache, self.path)
227
+ return self.cache
228
+
196
229
  msg1 = f"""
197
230
  📦 ════════════════════ CACHE OPERATION ════════════════════
198
231
  🔄 {self.name} cache: Reading cached values from `{self.path}`
199
- ⏱️ Lag = {age}
200
- ════════════════════════════════════════════════════════════
201
- """
232
+ ⏱️ Lag = {age}"""
202
233
  try:
203
234
  self.cache = self.reader(self.path)
204
235
  except Exception as ex:
205
- if self.logger:
206
- msg2 = f"""
236
+ msg2 = f"""
207
237
  ❌ ════════════════════ CACHE ERROR ════════════════════
208
238
  ⚠️ {self.name} cache: Cache file is corrupted
209
- 🔍 Error: {ex}
210
- ════════════════════════════════════════════════════════
211
- """
212
- self.logger(msg1 + msg2)
239
+ 🔍 Error: {ex}"""
240
+ self.logger.warning(msg1 + msg2)
241
+ t0 = time.time()
213
242
  self.cache = self.source_func()
214
- self.last_call_is_fresh = True
243
+ self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
215
244
  self.time_produced = datetime.now()
216
- # if self.path is not None:
217
- # self.save(self.cache, self.path)
245
+ self.save(self.cache, self.path)
218
246
  return self.cache
219
- return self(fresh=False) # may be the cache is old ==> check that by passing it through the logic again.
220
- else:
221
- if self.logger:
222
- # Previous cache never existed or there was an explicit fresh order.
223
- why = "There was an explicit fresh order." if fresh else "Previous cache never existed or is corrupted."
224
- self.logger(f"""
247
+ else: # disk cache does not exist, populate from source func.
248
+ why = "Previous cache never existed."
249
+ self.logger.warning(f"""
225
250
  🆕 ════════════════════ NEW CACHE ════════════════════
226
251
  🔄 {self.name} cache: Populating fresh cache from source func
227
- ℹ️ Reason: {why}
228
- ════════════════════════════════════════════════════════
229
- """)
252
+ ℹ️ Reason: {why}""")
253
+ t0 = time.time()
230
254
  self.cache = self.source_func() # fresh data.
231
- self.last_call_is_fresh = True
255
+ self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
232
256
  self.time_produced = datetime.now()
233
- if self.path is not None:
234
- self.save(self.cache, self.path)
235
- else: # cache exists
236
- try:
237
- age = self.age
238
- except AttributeError: # path doesn't exist (may be deleted) ==> need to repopulate cache form source_func.
239
- return self(fresh=True)
240
- if age > self.expire:
241
- if self.logger:
242
- self.logger(f"""
257
+ self.save(self.cache, self.path)
258
+ else: # memory cache exists
259
+ age = datetime.now() - self.time_produced
260
+ if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)): # cache is old or if fresh flag is raised
261
+ self.logger.warning(f"""
243
262
  🔄 ════════════════════ CACHE UPDATE ════════════════════
244
263
  ⚠️ {self.name} cache: Updating cache from source func
245
- ⏱️ Age = {age} > {self.expire}
246
- ════════════════════════════════════════════════════════""")
264
+ ⏱️ Age = {age} > {self.expire}""")
265
+ t0 = time.time()
247
266
  self.cache = self.source_func()
248
- self.last_call_is_fresh = True
267
+ self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
249
268
  self.time_produced = datetime.now()
250
- if self.path is not None:
251
- self.save(self.cache, self.path)
269
+ self.save(self.cache, self.path)
252
270
  else:
253
- if self.logger:
254
- self.logger(f"""
271
+ self.logger.warning(f"""
255
272
  ✅ ════════════════════ USING CACHE ════════════════════
256
273
  📦 {self.name} cache: Using cached values
257
- ⏱️ Lag = {age}
258
- ════════════════════════════════════════════════════════""")
274
+ ⏱️ Lag = {age}""")
259
275
  return self.cache
260
276
 
261
277
  @staticmethod
262
278
  def as_decorator(
263
- expire: timedelta, logger: Optional[PrintFunc] = None, path: Optional[Path] = None, saver: Callable[[T2, Path], Any] = to_pickle, reader: Callable[[Path], T2] = from_pickle, name: Optional[str] = None
279
+ expire: timedelta, logger: LoggerTemplate, path: Path, saver: Callable[[T2, Path], Any] = to_pickle, reader: Callable[[Path], T2] = from_pickle, name: Optional[str] = None
264
280
  ): # -> Callable[..., 'Cache[T2]']:
265
281
  def decorator(source_func: Callable[[], T2]) -> Cache["T2"]:
266
282
  res = Cache(source_func=source_func, expire=expire, logger=logger, path=path, name=name, reader=reader, saver=saver)
267
283
  return res
268
-
269
284
  return decorator
270
-
271
- def from_cloud(self, cloud: str, rel2home: bool = True, root: Optional[str] = None):
272
- assert self.path is not None
273
- exists = self.path.exists()
274
- exists_but_old = exists and ((datetime.now() - datetime.fromtimestamp(self.path.stat().st_mtime)) > self.expire)
275
- if not exists or exists_but_old:
276
- returned_path = self.path.from_cloud(cloud=cloud, rel2home=rel2home, root=root)
277
- if returned_path is None and not exists:
278
- raise FileNotFoundError(f"❌ Failed to get @ {self.path}. Build the cache first with signed API.")
279
- elif returned_path is None and exists and self.logger is not None:
280
- self.logger(f"""
281
- ⚠️ ════════════════════ CLOUD FETCH WARNING ════════════════════
282
- 🔄 Failed to get fresh data from cloud
283
- 📦 Using old cache @ {self.path}
284
- ════════════════════════════════════════════════════════════════""")
285
- else:
286
- pass # maybe we don't need to fetch it from cloud, if its too hot
287
- return self.reader(self.path)
@@ -1,7 +1,6 @@
1
1
  # """Task scheduler
2
2
  # """
3
3
 
4
- # from machineconfig.utils.utils import get_shell_script_executing_python_file
5
4
  # from machineconfig.utils.utils2 import read_ini
6
5
  # from dataclasses import dataclass
7
6
  # from datetime import datetime, timedelta
@@ -140,8 +139,6 @@
140
139
  # start: datetime
141
140
  # end: datetime
142
141
  # status: str
143
-
144
- # @classmethod
145
142
  # def from_path(cls, path: PathExtended, return_default_if_not_found: bool=False):
146
143
  # if not path.exists():
147
144
  # if return_default_if_not_found:
@@ -6,8 +6,7 @@ capturing all user inputs collected during interactive execution.
6
6
 
7
7
  from pathlib import Path
8
8
  from typing import TypedDict, Literal, NotRequired
9
- from machineconfig.scripts.python.fire_agents_load_balancer import SPLITTING_STRATEGY
10
- from machineconfig.scripts.python.fire_agents_help_launch import AGENTS
9
+ from machineconfig.scripts.python.helpers_agents.fire_agents_help_launch import AGENTS
11
10
 
12
11
  SEARCH_STRATEGIES = Literal["file_path", "keyword_search", "filename_pattern"]
13
12
 
@@ -21,26 +20,17 @@ class FilePathSearchInput(TypedDict):
21
20
 
22
21
  class KeywordSearchInput(TypedDict):
23
22
  """Input for keyword_search strategy."""
24
-
25
23
  keyword: str
26
24
 
27
25
 
28
26
  class FilenamePatternSearchInput(TypedDict):
29
27
  """Input for filename_pattern search strategy."""
30
-
31
28
  pattern: str # e.g., '*.py', '*test*', 'config.*'
32
29
 
33
30
 
34
- class AgentCapSplittingInput(TypedDict):
35
- """Input for agent_cap splitting strategy."""
36
-
37
- agent_cap: int # Default: 6
38
-
39
-
40
- class TaskRowsSplittingInput(TypedDict):
41
- """Input for task_rows splitting strategy."""
42
-
43
- task_rows: int # Default: 13
31
+ class TasksPerPromptSplittingInput(TypedDict):
32
+ """Input for tasks_per_prompt splitting strategy."""
33
+ tasks_per_prompt: int # Default: 13
44
34
 
45
35
 
46
36
  class FireAgentsMainInput(TypedDict):
@@ -49,7 +39,6 @@ class FireAgentsMainInput(TypedDict):
49
39
  # Core configuration
50
40
  repo_root: Path
51
41
  search_strategy: SEARCH_STRATEGIES
52
- splitting_strategy: SPLITTING_STRATEGY
53
42
  agent_selected: AGENTS
54
43
  prompt_prefix: str
55
44
  job_name: str # Default: "AI_Agents"
@@ -62,8 +51,7 @@ class FireAgentsMainInput(TypedDict):
62
51
  filename_pattern_input: NotRequired[FilenamePatternSearchInput]
63
52
 
64
53
  # Splitting strategy specific inputs (only one will be present based on splitting_strategy)
65
- agent_cap_input: NotRequired[AgentCapSplittingInput]
66
- task_rows_input: NotRequired[TaskRowsSplittingInput]
54
+ tasks_per_prompt: TasksPerPromptSplittingInput
67
55
 
68
56
 
69
57
  class FireAgentsRuntimeData(TypedDict):
@@ -1,20 +1,42 @@
1
- from typing import TypedDict, Literal, TypeAlias
1
+ from typing import TypedDict, Literal, TypeAlias, Optional
2
+ import platform
2
3
 
3
4
 
4
- APP_INSTALLER_CATEGORY: TypeAlias = Literal["OS_SPECIFIC", "OS_GENERIC", "CUSTOM", "OS_SPECIFIC_DEV", "OS_GENERIC_DEV", "CUSTOM_DEV"]
5
5
  CPU_ARCHITECTURES: TypeAlias = Literal["amd64", "arm64"]
6
6
  OPERATING_SYSTEMS: TypeAlias = Literal["windows", "linux", "macos"]
7
7
 
8
8
 
9
9
  class InstallerData(TypedDict):
10
10
  appName: str
11
- repoURL: str
12
11
  doc: str
13
- filenameTemplate: dict[CPU_ARCHITECTURES, dict[OPERATING_SYSTEMS, str]]
14
- stripVersion: bool
15
- exeName: str
12
+ repoURL: str
13
+ fileNamePattern: dict[CPU_ARCHITECTURES, dict[OPERATING_SYSTEMS, Optional[str]]]
16
14
 
17
15
 
18
16
  class InstallerDataFiles(TypedDict):
19
17
  version: str
20
18
  installers: list[InstallerData]
19
+
20
+
21
+ def get_os_name() -> OPERATING_SYSTEMS:
22
+ """Get the operating system name in the format expected by the github parser."""
23
+ sys_name = platform.system()
24
+ if sys_name == "Windows":
25
+ return "windows"
26
+ elif sys_name == "Linux":
27
+ return "linux"
28
+ elif sys_name == "Darwin":
29
+ return "macos"
30
+ else:
31
+ raise NotImplementedError(f"System {sys_name} not supported")
32
+
33
+
34
+ def get_normalized_arch() -> CPU_ARCHITECTURES:
35
+ """Get the normalized CPU architecture."""
36
+ arch_raw = platform.machine().lower()
37
+ if arch_raw in ("x86_64", "amd64"):
38
+ return "amd64"
39
+ if arch_raw in ("aarch64", "arm64", "armv8", "armv8l"):
40
+ return "arm64"
41
+ # Default to amd64 if unknown architecture
42
+ return "amd64"