machineconfig 5.15__py3-none-any.whl → 7.98__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.
Files changed (472) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/cloud_manager.py +1 -1
  3. machineconfig/cluster/remote/distribute.py +0 -1
  4. machineconfig/cluster/remote/file_manager.py +0 -2
  5. machineconfig/cluster/remote/script_execution.py +0 -1
  6. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +70 -210
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +52 -198
  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 +25 -170
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +16 -12
  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 +2 -3
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/hx.py +76 -19
  34. machineconfig/jobs/installer/custom/yazi.py +119 -0
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  36. machineconfig/jobs/installer/custom_dev/brave.py +5 -9
  37. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  38. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  39. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  40. machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
  41. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +33 -28
  42. machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
  43. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  44. machineconfig/jobs/installer/custom_dev/winget.py +10 -14
  45. machineconfig/jobs/installer/installer_data.json +1487 -229
  46. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  47. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  48. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  49. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  50. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  51. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  52. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  53. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  54. machineconfig/jobs/installer/linux_scripts/q.sh +10 -6
  55. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  56. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  57. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  58. machineconfig/jobs/installer/package_groups.py +106 -177
  59. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  60. machineconfig/logger.py +0 -1
  61. machineconfig/profile/backup.toml +49 -0
  62. machineconfig/profile/bash_shell_profiles.md +11 -0
  63. machineconfig/profile/create_helper.py +62 -0
  64. machineconfig/profile/create_links.py +288 -0
  65. machineconfig/profile/create_links_export.py +100 -0
  66. machineconfig/profile/create_shell_profile.py +147 -0
  67. machineconfig/profile/mapper.toml +263 -0
  68. machineconfig/scripts/__init__.py +0 -4
  69. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  70. machineconfig/scripts/linux/wrap_mcfg +46 -0
  71. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  72. machineconfig/scripts/python/agents.py +123 -117
  73. machineconfig/scripts/python/ai/initai.py +3 -28
  74. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  75. machineconfig/scripts/python/ai/scripts/command_runner.sh +9 -0
  76. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  77. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  78. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  79. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  80. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  81. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  82. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  83. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +5 -1
  84. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  85. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  86. machineconfig/scripts/python/ai/solutions/generic.py +28 -5
  87. machineconfig/scripts/python/ai/utils/generate_files.py +348 -0
  88. machineconfig/scripts/python/ai/utils/vscode_tasks.py +37 -0
  89. machineconfig/scripts/python/cloud.py +29 -0
  90. machineconfig/scripts/python/croshell.py +137 -113
  91. machineconfig/scripts/python/devops.py +61 -101
  92. machineconfig/scripts/python/devops_navigator.py +6 -0
  93. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  94. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  95. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  96. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  97. machineconfig/scripts/python/fire_jobs.py +110 -150
  98. machineconfig/scripts/python/ftpx.py +51 -24
  99. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  100. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  101. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  102. machineconfig/scripts/python/helpers/run_py_script.py +79 -0
  103. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  104. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  106. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  107. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  108. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  109. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  110. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +126 -0
  111. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  112. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  113. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  114. machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
  115. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  116. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +29 -35
  117. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  118. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  119. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  120. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +8 -9
  121. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  122. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  123. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  124. machineconfig/scripts/python/helpers_devops/cli_nw.py +214 -0
  125. machineconfig/scripts/python/helpers_devops/cli_repos.py +215 -0
  126. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  127. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  128. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  129. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_share_terminal.py} +45 -35
  130. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  131. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  132. machineconfig/scripts/python/helpers_devops/devops_status.py +499 -0
  133. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  134. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  135. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  136. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +3 -3
  137. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  138. machineconfig/scripts/python/helpers_fire_command/f.py +0 -0
  139. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  140. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  141. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +121 -0
  142. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  143. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  144. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  145. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  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_network/__init__.py +0 -0
  154. machineconfig/scripts/python/helpers_network/address.py +132 -0
  155. machineconfig/scripts/python/{devops_add_identity.py → helpers_network/devops_add_identity.py} +0 -2
  156. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +153 -0
  157. machineconfig/scripts/{linux → python/helpers_network}/mount_nfs +0 -1
  158. machineconfig/scripts/python/{mount_nfs.py → helpers_network/mount_nfs.py} +3 -3
  159. machineconfig/scripts/{linux → python/helpers_network}/mount_nw_drive +1 -2
  160. machineconfig/scripts/python/{mount_ssh.py → helpers_network/mount_ssh.py} +3 -3
  161. machineconfig/scripts/python/{onetimeshare.py → helpers_network/onetimeshare.py} +0 -1
  162. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +391 -0
  163. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +338 -0
  164. machineconfig/scripts/python/{wifi_conn.py → helpers_network/wifi_conn.py} +1 -53
  165. machineconfig/scripts/python/{wsl_windows_transfer.py → helpers_network/wsl_windows_transfer.py} +5 -4
  166. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  167. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  168. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  169. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  170. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  171. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  172. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  173. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  174. machineconfig/scripts/python/{count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  175. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  176. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  177. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  178. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +65 -0
  179. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  180. machineconfig/scripts/python/helpers_utils/path.py +185 -0
  181. machineconfig/scripts/python/interactive.py +64 -84
  182. machineconfig/scripts/python/mcfg_entry.py +58 -0
  183. machineconfig/scripts/python/msearch.py +71 -0
  184. machineconfig/scripts/python/sessions.py +119 -45
  185. machineconfig/scripts/python/terminal.py +133 -0
  186. machineconfig/scripts/python/utils.py +64 -0
  187. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
  188. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  189. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  190. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  191. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  192. machineconfig/settings/broot/br.sh +0 -4
  193. machineconfig/settings/broot/conf.toml +1 -1
  194. machineconfig/settings/helix/config.toml +16 -0
  195. machineconfig/settings/helix/languages.toml +13 -4
  196. machineconfig/settings/helix/yazi-picker.sh +12 -0
  197. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  198. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  199. machineconfig/settings/lf/linux/lfrc +10 -12
  200. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  201. machineconfig/settings/lf/windows/lfrc +18 -38
  202. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  203. machineconfig/settings/linters/.ruff.toml +1 -1
  204. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  205. machineconfig/settings/marimo/marimo.toml +80 -0
  206. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  207. machineconfig/settings/pistol/pistol.conf +1 -1
  208. machineconfig/settings/shells/bash/init.sh +82 -31
  209. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  210. machineconfig/settings/shells/nushell/config.nu +2 -35
  211. machineconfig/settings/shells/nushell/env.nu +45 -6
  212. machineconfig/settings/shells/nushell/init.nu +314 -0
  213. machineconfig/settings/shells/pwsh/init.ps1 +61 -43
  214. machineconfig/settings/shells/starship/starship.toml +16 -0
  215. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  216. machineconfig/settings/shells/wt/settings.json +32 -17
  217. machineconfig/settings/shells/zsh/init.sh +89 -0
  218. machineconfig/settings/svim/linux/init.toml +0 -4
  219. machineconfig/settings/svim/windows/init.toml +0 -3
  220. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  221. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  222. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  223. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  224. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  225. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  226. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  227. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  228. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  229. machineconfig/settings/television/cable_unix/env.toml +17 -0
  230. machineconfig/settings/television/cable_unix/files.toml +11 -0
  231. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  232. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  233. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  234. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  235. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  236. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  237. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  238. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  239. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  240. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  241. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  242. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  243. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  244. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  245. machineconfig/settings/television/cable_unix/text.toml +17 -0
  246. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  247. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  248. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  249. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  250. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  251. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  252. machineconfig/settings/television/cable_windows/env.toml +17 -0
  253. machineconfig/settings/television/cable_windows/files.toml +14 -0
  254. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  255. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  256. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  257. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  258. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  259. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  260. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  261. machineconfig/settings/television/cable_windows/text.toml +17 -0
  262. machineconfig/settings/yazi/init.lua +61 -0
  263. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  264. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  265. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  266. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  267. machineconfig/settings/yazi/theme.toml +4 -0
  268. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  269. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  270. machineconfig/setup_linux/__init__.py +11 -0
  271. machineconfig/setup_linux/apps_desktop.sh +89 -0
  272. machineconfig/setup_linux/apps_gui.sh +64 -0
  273. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  274. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  275. machineconfig/setup_linux/uv.sh +15 -0
  276. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  277. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  278. machineconfig/setup_mac/__init__.py +16 -0
  279. machineconfig/setup_mac/apps_gui.sh +248 -0
  280. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  281. machineconfig/setup_mac/uv.sh +36 -0
  282. machineconfig/setup_windows/__init__.py +11 -0
  283. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  284. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  285. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  286. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  287. machineconfig/setup_windows/uv.ps1 +17 -0
  288. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  289. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  290. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  291. machineconfig/utils/accessories.py +7 -5
  292. machineconfig/utils/cloud/onedrive/README.md +139 -0
  293. machineconfig/utils/code.py +155 -105
  294. machineconfig/utils/files/art/fat_croco.txt +10 -0
  295. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  296. machineconfig/utils/files/art/happy_croco.txt +22 -0
  297. machineconfig/utils/files/art/water_croco.txt +11 -0
  298. machineconfig/utils/files/ascii_art.py +1 -1
  299. machineconfig/utils/files/dbms.py +257 -0
  300. machineconfig/utils/files/headers.py +11 -14
  301. machineconfig/utils/files/ouch/__init__.py +0 -0
  302. machineconfig/utils/files/ouch/decompress.py +45 -0
  303. machineconfig/utils/files/read.py +10 -18
  304. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  305. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  306. machineconfig/utils/installer_utils/installer_class.py +64 -181
  307. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  308. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  309. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +66 -97
  310. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +49 -82
  311. machineconfig/utils/io.py +77 -23
  312. machineconfig/utils/links.py +254 -162
  313. machineconfig/utils/meta.py +256 -0
  314. machineconfig/utils/notifications.py +1 -1
  315. machineconfig/utils/options.py +46 -18
  316. machineconfig/utils/options_tv.py +119 -0
  317. machineconfig/utils/path_extended.py +48 -101
  318. machineconfig/utils/path_helper.py +76 -23
  319. machineconfig/utils/procs.py +50 -70
  320. machineconfig/utils/scheduler.py +88 -124
  321. machineconfig/utils/scheduling.py +0 -3
  322. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  323. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  324. machineconfig/utils/source_of_truth.py +3 -6
  325. machineconfig/utils/ssh.py +263 -274
  326. machineconfig/utils/ssh_utils/abc.py +5 -0
  327. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  328. machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
  329. machineconfig/utils/ssh_utils/utils.py +142 -0
  330. machineconfig/utils/ssh_utils/wsl.py +210 -0
  331. machineconfig/utils/terminal.py +3 -113
  332. machineconfig/utils/tst.py +20 -0
  333. machineconfig/utils/upgrade_packages.py +114 -28
  334. machineconfig/utils/ve.py +12 -4
  335. machineconfig-7.98.dist-info/METADATA +132 -0
  336. machineconfig-7.98.dist-info/RECORD +504 -0
  337. machineconfig-7.98.dist-info/entry_points.txt +13 -0
  338. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  339. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  340. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  341. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  342. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  343. machineconfig/jobs/python/vscode/api.py +0 -57
  344. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  345. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  346. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  347. machineconfig/jobs/windows/startup_file.cmd +0 -2
  348. machineconfig/profile/create.py +0 -303
  349. machineconfig/profile/shell.py +0 -176
  350. machineconfig/scripts/cloud/init.sh +0 -119
  351. machineconfig/scripts/linux/agents +0 -2
  352. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  353. machineconfig/scripts/linux/cloud_copy +0 -2
  354. machineconfig/scripts/linux/cloud_mount +0 -2
  355. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  356. machineconfig/scripts/linux/cloud_sync +0 -2
  357. machineconfig/scripts/linux/croshell +0 -3
  358. machineconfig/scripts/linux/devops +0 -2
  359. machineconfig/scripts/linux/fire +0 -2
  360. machineconfig/scripts/linux/ftpx +0 -2
  361. machineconfig/scripts/linux/fzf2g +0 -21
  362. machineconfig/scripts/linux/fzfag +0 -17
  363. machineconfig/scripts/linux/fzffg +0 -25
  364. machineconfig/scripts/linux/fzfrga +0 -21
  365. machineconfig/scripts/linux/gh_models +0 -2
  366. machineconfig/scripts/linux/initai +0 -2
  367. machineconfig/scripts/linux/kill_process +0 -2
  368. machineconfig/scripts/linux/scheduler +0 -2
  369. machineconfig/scripts/linux/sessions +0 -2
  370. machineconfig/scripts/linux/share_smb +0 -1
  371. machineconfig/scripts/linux/skrg +0 -4
  372. machineconfig/scripts/linux/start_slidev +0 -2
  373. machineconfig/scripts/linux/start_terminals +0 -3
  374. machineconfig/scripts/linux/warp-cli.sh +0 -122
  375. machineconfig/scripts/linux/wifi_conn +0 -2
  376. machineconfig/scripts/linux/z_ls +0 -104
  377. machineconfig/scripts/python/ai/generate_files.py +0 -83
  378. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  379. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  380. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  381. machineconfig/scripts/python/devops_add_ssh_key.py +0 -120
  382. machineconfig/scripts/python/dotfile.py +0 -78
  383. machineconfig/scripts/python/fire_agents_help_launch.py +0 -120
  384. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  385. machineconfig/scripts/python/fire_jobs_route_helper.py +0 -65
  386. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  387. machineconfig/scripts/python/gh_models.py +0 -104
  388. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  389. machineconfig/scripts/python/repos.py +0 -132
  390. machineconfig/scripts/python/repos_helper_action.py +0 -378
  391. machineconfig/scripts/python/snapshot.py +0 -25
  392. machineconfig/scripts/python/start_terminals.py +0 -121
  393. machineconfig/scripts/python/t4.py +0 -17
  394. machineconfig/scripts/windows/agents.ps1 +0 -1
  395. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  396. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  397. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  398. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  399. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  400. machineconfig/scripts/windows/croshell.ps1 +0 -1
  401. machineconfig/scripts/windows/devops.ps1 +0 -1
  402. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  403. machineconfig/scripts/windows/fire.ps1 +0 -1
  404. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  405. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  406. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  407. machineconfig/scripts/windows/fzfrga.bat +0 -20
  408. machineconfig/scripts/windows/gpt.ps1 +0 -1
  409. machineconfig/scripts/windows/grep.ps1 +0 -2
  410. machineconfig/scripts/windows/initai.ps1 +0 -1
  411. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  412. machineconfig/scripts/windows/nano.ps1 +0 -3
  413. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  414. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  415. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  416. machineconfig/scripts/windows/sessions.ps1 +0 -1
  417. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  418. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  419. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  420. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  421. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  422. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  423. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  424. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  425. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  426. machineconfig/settings/yazi/yazi.toml +0 -4
  427. machineconfig/setup_linux/nix/cli_installation.sh +0 -157
  428. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  429. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  430. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  431. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  432. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  433. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  434. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  435. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  436. machineconfig/utils/installer_utils/installer.py +0 -189
  437. machineconfig-5.15.dist-info/METADATA +0 -188
  438. machineconfig-5.15.dist-info/RECORD +0 -415
  439. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  440. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  441. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  442. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  443. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  444. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  445. machineconfig/scripts/python/{helpers → helpers_agents}/__init__.py +0 -0
  446. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_agents/agentic_frameworks/__init__.py} +0 -0
  447. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  448. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  449. machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_cloud/__init__.py} +0 -0
  450. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  451. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  452. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_croshell/__init__.py} +0 -0
  453. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  454. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  455. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  456. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  457. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/__init__.py} +0 -0
  458. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_devops/themes/__init__.py} +0 -0
  459. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  460. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  461. /machineconfig/scripts/{linux → python/helpers_network}/mount_drive +0 -0
  462. /machineconfig/scripts/python/{mount_nw_drive.py → helpers_network/mount_nw_drive.py} +0 -0
  463. /machineconfig/scripts/{linux → python/helpers_network}/mount_smb +0 -0
  464. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  465. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  466. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  467. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  468. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  469. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  470. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  471. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
  472. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
@@ -1,12 +1,9 @@
1
1
  #!/usr/bin/env python3
2
2
  from datetime import datetime
3
- import json
4
- import uuid
5
3
  import logging
6
4
  import subprocess
7
5
  import time
8
- from pathlib import Path
9
- from typing import Optional, List
6
+ from typing import Optional
10
7
 
11
8
  from rich.console import Console
12
9
 
@@ -14,13 +11,13 @@ from machineconfig.cluster.sessions_managers.zellij_utils.monitoring_types impor
14
11
  from machineconfig.utils.scheduler import Scheduler
15
12
  from machineconfig.cluster.sessions_managers.zellij_local import ZellijLayoutGenerator
16
13
  from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
14
+ from machineconfig.cluster.sessions_managers.zellij_utils import zellij_local_manager_helper as helper
17
15
 
18
16
 
19
17
  logging.basicConfig(level=logging.INFO)
20
18
  logger = logging.getLogger(__name__)
21
19
  console = Console()
22
20
 
23
- TMP_SERIALIZATION_DIR = Path.home().joinpath("tmp_results", "session_manager", "zellij", "local_manager")
24
21
 
25
22
 
26
23
  class ZellijLocalManager:
@@ -29,22 +26,23 @@ class ZellijLocalManager:
29
26
  def __init__(self, session_layouts: list[LayoutConfig]):
30
27
  self.session_name_prefix = "LocalJobMgr"
31
28
  self.session_layouts = session_layouts # Store the original config
32
- self.managers: List[ZellijLayoutGenerator] = []
29
+ self.managers: list[ZellijLayoutGenerator] = []
33
30
 
34
31
  # Create a ZellijLayoutGenerator for each session
35
32
  for layout_config in session_layouts:
36
33
  session_name = layout_config["layoutName"].replace(" ", "_")
37
- manager = ZellijLayoutGenerator()
38
34
  full_session_name = f"{self.session_name_prefix}_{session_name}"
39
- manager.create_zellij_layout(layout_config=layout_config, output_dir=None, session_name=full_session_name)
35
+ manager = ZellijLayoutGenerator(layout_config=layout_config, session_name=full_session_name)
36
+ manager.create_layout_file()
37
+
40
38
  self.managers.append(manager)
41
39
 
42
40
  # Enhanced Rich logging for initialization
43
41
  console.print(f"[bold green]🔧 Initialized ZellijLocalManager[/bold green] [dim]with[/dim] [bright_green]{len(self.managers)} sessions[/bright_green]")
44
42
 
45
- def get_all_session_names(self) -> List[str]:
43
+ def get_all_session_names(self) -> list[str]:
46
44
  """Get all managed session names."""
47
- return [manager.session_name for manager in self.managers if manager.session_name is not None]
45
+ return helper.get_all_session_names(self.managers)
48
46
 
49
47
  def start_all_sessions(self, poll_seconds: float, poll_interval: float) -> dict[str, StartResult]:
50
48
  """Start all zellij sessions with their layouts without blocking on the interactive TUI.
@@ -66,8 +64,6 @@ class ZellijLocalManager:
66
64
  for manager in self.managers:
67
65
  session_name = manager.session_name
68
66
  try:
69
- if session_name is None:
70
- continue
71
67
  layout_path = manager.layout_path
72
68
  if not layout_path:
73
69
  results[session_name] = {"success": False, "error": "No layout file path available"}
@@ -88,6 +84,7 @@ class ZellijLocalManager:
88
84
  # ZELLIJ_AUTO_ATTACH=0 prevents auto-attach if compiled with that feature; harmless otherwise.
89
85
  start_cmd = ["bash", "-lc", f"ZELLIJ_AUTO_ATTACH=0 zellij --layout {layout_path} attach {session_name} --create >/dev/null 2>&1 &"]
90
86
  console.print(f"[bold cyan]🚀 Starting session[/bold cyan] [yellow]'{session_name}'[/yellow] with layout [blue]{layout_path}[/blue] (non-blocking)...")
87
+ console.print(f"[dim] Command: {' '.join(start_cmd)}[/dim]")
91
88
  subprocess.Popen(start_cmd)
92
89
 
93
90
  # 3. Poll for presence
@@ -114,23 +111,7 @@ class ZellijLocalManager:
114
111
 
115
112
  def kill_all_sessions(self) -> dict[str, StartResult]:
116
113
  """Kill all managed zellij sessions."""
117
- results: dict[str, StartResult] = {}
118
- for manager in self.managers:
119
- try:
120
- session_name = manager.session_name
121
- if session_name is None:
122
- continue # Skip managers without a session name
123
- cmd = f"zellij delete-session --force {session_name}"
124
- logger.info(f"Killing session '{session_name}'")
125
- result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=10)
126
- results[session_name] = {"success": result.returncode == 0, "message": "Session killed" if result.returncode == 0 else result.stderr}
127
-
128
- except Exception as e:
129
- # Use a fallback key since session_name might not be defined here
130
- key = getattr(manager, "session_name", None) or f"manager_{self.managers.index(manager)}"
131
- results[key] = {"success": False, "error": str(e)}
132
-
133
- return results
114
+ return helper.kill_all_sessions(self.managers)
134
115
 
135
116
  def attach_to_session(self, session_name: Optional[str]) -> str:
136
117
  """
@@ -142,20 +123,7 @@ class ZellijLocalManager:
142
123
  Returns:
143
124
  Command string to attach to session(s)
144
125
  """
145
- if session_name:
146
- # Find the specific session
147
- for manager in self.managers:
148
- if manager.session_name == session_name:
149
- return f"zellij attach {session_name}"
150
- raise ValueError(f"Session '{session_name}' not found")
151
- else:
152
- # Return commands for all sessions
153
- commands: list[str] = []
154
- for manager in self.managers:
155
- commands.append(f"# Attach to session '{manager.session_name}':")
156
- commands.append(f"zellij attach {manager.session_name}")
157
- commands.append("")
158
- return "\n".join(commands)
126
+ return helper.attach_to_session(self.managers, session_name)
159
127
 
160
128
  def check_all_sessions_status(self) -> dict[str, SessionReport]:
161
129
  """Check the status of all sessions and their commands."""
@@ -163,11 +131,10 @@ class ZellijLocalManager:
163
131
 
164
132
  for manager in self.managers:
165
133
  session_name = manager.session_name
166
- if session_name is None:
167
- continue # Skip managers without a session name
168
134
 
169
- # Get session status
170
- session_status = ZellijLayoutGenerator.check_zellij_session_status(session_name)
135
+ # Get session status using the helper function
136
+ from machineconfig.cluster.sessions_managers.zellij_utils.zellij_local_helper import check_zellij_session_status
137
+ session_status = check_zellij_session_status(session_name)
171
138
 
172
139
  # Get commands status for this session
173
140
  commands_status = manager.check_all_commands_status()
@@ -245,7 +212,7 @@ class ZellijLocalManager:
245
212
 
246
213
  if cmd_status.get("processes"):
247
214
  for proc in cmd_status["processes"][:2]: # Show first 2 processes
248
- print(f" └─ PID {proc['pid']}: {proc['name']} ({proc['status']})")
215
+ console.print(f" [dim]└─[/dim] PID {proc['pid']}: {proc['name']} ({proc['status']})")
249
216
  print()
250
217
 
251
218
  print("=" * 80)
@@ -309,148 +276,36 @@ class ZellijLocalManager:
309
276
  print(f"📊 Quick Summary: {global_summary['running_commands']}/{global_summary['total_commands']} commands running across {global_summary['healthy_sessions']}/{global_summary['total_sessions']} sessions")
310
277
 
311
278
  logger.info(f"Starting monitoring routine with {wait_ms}ms intervals")
312
- sched = Scheduler(routine=routine, wait_ms=wait_ms, logger=logger)
279
+ from machineconfig.utils.scheduler import LoggerTemplate
280
+ from typing import cast
281
+ sched = Scheduler(routine=routine, wait_ms=wait_ms, logger=cast(LoggerTemplate, logger))
313
282
  sched.run()
314
283
 
315
284
  def save(self, session_id: Optional[str]) -> str:
316
285
  """Save the manager state to disk."""
317
- if session_id is None:
318
- session_id = str(uuid.uuid4())[:8]
319
-
320
- # Create session directory
321
- session_dir = TMP_SERIALIZATION_DIR / session_id
322
- session_dir.mkdir(parents=True, exist_ok=True)
323
-
324
- # Save the session_layouts configuration
325
- config_file = session_dir / "session_layouts.json"
326
- text = json.dumps(self.session_layouts, indent=2, ensure_ascii=False)
327
- config_file.write_text(text, encoding="utf-8")
328
-
329
- # Save metadata
330
- metadata = {"session_name_prefix": self.session_name_prefix, "created_at": str(datetime.now()), "num_managers": len(self.managers), "sessions": [item["layoutName"] for item in self.session_layouts], "manager_type": "ZellijLocalManager"}
331
- metadata_file = session_dir / "metadata.json"
332
- text = json.dumps(metadata, indent=2, ensure_ascii=False)
333
- metadata_file.write_text(text, encoding="utf-8")
334
-
335
- # Save each manager's state
336
- managers_dir = session_dir / "managers"
337
- managers_dir.mkdir(exist_ok=True)
338
-
339
- for i, manager in enumerate(self.managers):
340
- manager_data = {"session_name": manager.session_name, "layout_config": manager.layout_config, "layout_path": manager.layout_path}
341
- manager_file = managers_dir / f"manager_{i}_{manager.session_name}.json"
342
- text = json.dumps(manager_data, indent=2, ensure_ascii=False)
343
- manager_file.write_text(text, encoding="utf-8")
344
-
345
- logger.info(f"✅ Saved ZellijLocalManager session to: {session_dir}")
346
- return session_id
286
+ return helper.save_manager(self.session_layouts, self.managers, self.session_name_prefix, session_id)
347
287
 
348
288
  @classmethod
349
289
  def load(cls, session_id: str) -> "ZellijLocalManager":
350
290
  """Load a saved manager state from disk."""
351
- session_dir = TMP_SERIALIZATION_DIR / session_id
352
-
353
- if not session_dir.exists():
354
- raise FileNotFoundError(f"Session directory not found: {session_dir}")
355
-
356
- # Load configuration
357
- config_file = session_dir / "session_layouts.json"
358
- if not config_file.exists():
359
- raise FileNotFoundError(f"Configuration file not found: {config_file}")
360
-
361
- text = config_file.read_text(encoding="utf-8")
362
- session_layouts = json.loads(text)
363
-
364
- # Create new instance
291
+ session_layouts, managers = helper.load_manager(session_id)
365
292
  instance = cls(session_layouts=session_layouts)
366
-
367
- # Load saved manager states
368
- managers_dir = session_dir / "managers"
369
- if managers_dir.exists():
370
- instance.managers = []
371
- manager_files = sorted(managers_dir.glob("manager_*.json"))
372
-
373
- for manager_file in manager_files:
374
- try:
375
- text = manager_file.read_text(encoding="utf-8")
376
- manager_data = json.loads(text)
377
-
378
- # Recreate the manager
379
- manager = ZellijLayoutGenerator()
380
- manager.session_name = manager_data["session_name"]
381
- manager.layout_config = manager_data["layout_config"]
382
- manager.layout_path = manager_data["layout_path"]
383
-
384
- instance.managers.append(manager)
385
-
386
- except Exception as e:
387
- logger.warning(f"Failed to load manager from {manager_file}: {e}")
388
-
389
- logger.info(f"✅ Loaded ZellijLocalManager session from: {session_dir}")
293
+ instance.managers = managers
390
294
  return instance
391
295
 
392
296
  @staticmethod
393
- def list_saved_sessions() -> List[str]:
297
+ def list_saved_sessions() -> list[str]:
394
298
  """List all saved session IDs."""
395
- if not TMP_SERIALIZATION_DIR.exists():
396
- return []
397
-
398
- sessions = []
399
- for item in TMP_SERIALIZATION_DIR.iterdir():
400
- if item.is_dir() and (item / "metadata.json").exists():
401
- sessions.append(item.name)
402
-
403
- return sorted(sessions)
299
+ return helper.list_saved_sessions()
404
300
 
405
301
  @staticmethod
406
302
  def delete_session(session_id: str) -> bool:
407
303
  """Delete a saved session."""
408
- session_dir = TMP_SERIALIZATION_DIR / session_id
409
-
410
- if not session_dir.exists():
411
- logger.warning(f"Session directory not found: {session_dir}")
412
- return False
413
-
414
- try:
415
- import shutil
416
-
417
- shutil.rmtree(session_dir)
418
- logger.info(f"✅ Deleted session: {session_id}")
419
- return True
420
- except Exception as e:
421
- logger.error(f"Failed to delete session {session_id}: {e}")
422
- return False
304
+ return helper.delete_session(session_id)
423
305
 
424
306
  def list_active_sessions(self) -> list[ActiveSessionInfo]:
425
307
  """List currently active zellij sessions managed by this instance."""
426
- active_sessions: list[ActiveSessionInfo] = []
427
-
428
- try:
429
- # Get all running zellij sessions
430
- result = subprocess.run(["zellij", "list-sessions"], capture_output=True, text=True, timeout=10)
431
-
432
- if result.returncode == 0:
433
- all_sessions = result.stdout.strip().split("\n") if result.stdout.strip() else []
434
-
435
- # Filter to only our managed sessions
436
- for manager in self.managers:
437
- session_name = manager.session_name
438
- if session_name is None:
439
- continue # Skip managers without a session name
440
- is_active = any(session_name in session for session in all_sessions)
441
-
442
- tab_info = []
443
- tab_count = 0
444
- if manager.layout_config:
445
- tab_count = len(manager.layout_config["layoutTabs"])
446
- tab_info = [tab["tabName"] for tab in manager.layout_config["layoutTabs"]]
447
-
448
- active_sessions.append({"session_name": session_name, "is_active": is_active, "tab_count": tab_count, "tabs": tab_info})
449
-
450
- except Exception as e:
451
- logger.error(f"Error listing active sessions: {e}")
452
-
453
- return active_sessions
308
+ return helper.list_active_sessions(self.managers)
454
309
 
455
310
 
456
311
  if __name__ == "__main__":
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python3
2
- from typing import Dict, Optional, List, Union, Any
2
+ from typing import Optional, Any
3
3
  from pathlib import Path
4
4
  import logging
5
5
  import json
@@ -22,10 +22,10 @@ TMP_LAYOUT_DIR = Path.home().joinpath("tmp_results", "zellij_layouts", "layout_m
22
22
 
23
23
 
24
24
  class ZellijRemoteLayoutGenerator:
25
- def __init__(self, remote_name: str, session_name_prefix: str):
26
- self.remote_name = remote_name
27
- self.session_name = session_name_prefix + "_" + LayoutGenerator.generate_random_suffix(8)
28
- self.layout_config: Optional[LayoutConfig] = None
25
+ def __init__(self, layout_config: LayoutConfig, remote_name: str, session_name: str):
26
+ self.remote_name: str = remote_name
27
+ self.session_name: str = session_name
28
+ self.layout_config: LayoutConfig = layout_config.copy()
29
29
  self.layout_path: Optional[str] = None
30
30
 
31
31
  # Initialize modular components
@@ -35,23 +35,27 @@ class ZellijRemoteLayoutGenerator:
35
35
  self.session_manager = SessionManager(self.remote_executor, self.session_name, TMP_LAYOUT_DIR)
36
36
  self.status_reporter = StatusReporter(self.process_monitor, self.session_manager)
37
37
 
38
- def create_zellij_layout(self, layout_config: LayoutConfig, output_dir: Optional[str]) -> str:
38
+ def create_layout_file(self) -> bool:
39
+ """Create Zellij layout file and return success status."""
39
40
  # Enhanced Rich logging for remote layout creation
40
- tab_count = len(layout_config["layoutTabs"])
41
- layout_name = layout_config["layoutName"]
41
+ tab_count = len(self.layout_config["layoutTabs"])
42
+ layout_name = self.layout_config["layoutName"]
42
43
  console.print(f"[bold cyan]📋 Creating Zellij layout[/bold cyan] [bright_green]'{layout_name}' with {tab_count} tabs[/bright_green] [magenta]for remote[/magenta] [bold yellow]'{self.remote_name}'[/bold yellow]")
43
44
 
44
45
  # Display tab summary for remote
45
- for tab in layout_config["layoutTabs"]:
46
+ for tab in self.layout_config["layoutTabs"]:
46
47
  console.print(f" [yellow]→[/yellow] [bold]{tab['tabName']}[/bold] [dim]in[/dim] [blue]{tab['startDir']}[/blue] [dim]on[/dim] [yellow]{self.remote_name}[/yellow]")
47
48
 
48
- self.layout_config = layout_config.copy()
49
- if output_dir:
50
- output_path = Path(output_dir)
51
- else:
52
- output_path = TMP_LAYOUT_DIR
53
- self.layout_path = self.layout_generator.create_layout_file(layout_config, output_path, self.session_name)
54
- return self.layout_path
49
+ layout_content = self.layout_generator.create_layout_file(self.layout_config, session_name=self.session_name)
50
+
51
+ # Write to file
52
+ TMP_LAYOUT_DIR.mkdir(parents=True, exist_ok=True)
53
+ layout_file = TMP_LAYOUT_DIR / f"zellij_layout_{self.session_name}.kdl"
54
+ layout_file.write_text(layout_content, encoding="utf-8")
55
+ self.layout_path = str(layout_file.absolute())
56
+
57
+ console.print(f"[bold green]✅ Remote layout created:[/bold green] [cyan]{self.layout_path}[/cyan]")
58
+ return True
55
59
 
56
60
  # Static methods for backward compatibility
57
61
  @staticmethod
@@ -59,10 +63,10 @@ class ZellijRemoteLayoutGenerator:
59
63
  executor = RemoteExecutor(remote_name)
60
64
  return executor.run_command(command, timeout)
61
65
 
62
- def to_dict(self) -> Dict[str, Any]:
66
+ def to_dict(self) -> dict[str, Any]:
63
67
  return {"remote_name": self.remote_name, "session_name": self.session_name, "layout_config": self.layout_config, "layout_path": self.layout_path, "created_at": datetime.now().isoformat(), "class_name": self.__class__.__name__}
64
68
 
65
- def to_json(self, file_path: Optional[Union[str, Path]]) -> str:
69
+ def to_json(self, file_path: Optional[str | Path]) -> str:
66
70
  # Generate file path if not provided
67
71
  if file_path is None:
68
72
  random_id = str(uuid.uuid4())[:8]
@@ -89,7 +93,7 @@ class ZellijRemoteLayoutGenerator:
89
93
  return str(file_path_obj)
90
94
 
91
95
  @classmethod
92
- def from_json(cls, file_path: Union[str, Path]) -> "ZellijRemoteLayoutGenerator":
96
+ def from_json(cls, file_path: str | Path) -> "ZellijRemoteLayoutGenerator":
93
97
  file_path = Path(file_path)
94
98
 
95
99
  # Ensure .json extension
@@ -108,25 +112,18 @@ class ZellijRemoteLayoutGenerator:
108
112
  logger.warning(f"Class name mismatch: expected {cls.__name__}, got {data.get('class_name')}")
109
113
 
110
114
  # Create new instance
111
- # Extract session name prefix by removing the suffix
112
- session_name = data["session_name"]
113
- if "_" in session_name:
114
- session_name_prefix = "_".join(session_name.split("_")[:-1])
115
- else:
116
- session_name_prefix = session_name
117
-
118
- instance = cls(remote_name=data["remote_name"], session_name_prefix=session_name_prefix)
119
-
120
- # Restore state
121
- instance.session_name = data["session_name"]
122
- instance.layout_config = data["layout_config"]
115
+ instance = cls(
116
+ layout_config=data["layout_config"],
117
+ remote_name=data["remote_name"],
118
+ session_name=data["session_name"]
119
+ )
123
120
  instance.layout_path = data["layout_path"]
124
121
 
125
122
  logger.info(f"✅ Loaded ZellijRemoteLayoutGenerator from: {file_path}")
126
123
  return instance
127
124
 
128
125
  @staticmethod
129
- def list_saved_sessions(directory_path: Optional[Union[str, Path]]) -> List[str]:
126
+ def list_saved_sessions(directory_path: Optional[str | Path]) -> list[str]:
130
127
  if directory_path is None:
131
128
  directory_path = Path.home() / "tmp_results" / "zellij_sessions" / "serialized"
132
129
  else:
@@ -144,8 +141,8 @@ if __name__ == "__main__":
144
141
  sample_layout: LayoutConfig = {
145
142
  "layoutName": "RemoteBots",
146
143
  "layoutTabs": [
147
- {"tabName": "🤖Bot1", "startDir": "~/code/bytesense/bithence", "command": "~/scripts/fire -mO go1.py bot1 -- --create_new_bot=True"},
148
- {"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "~/scripts/fire -mO go2.py bot2 -- --create_new_bot=True"},
144
+ {"tabName": "🤖Bot1", "startDir": "~/code/bytesense/bithence", "command": "fire -mO go1.py bot1 -- --create_new_bot=True"},
145
+ {"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "fire -mO go2.py bot2 -- --create_new_bot=True"},
149
146
  {"tabName": "📊Monitor", "startDir": "~", "command": "htop"},
150
147
  {"tabName": "📝Logs", "startDir": "/var/log", "command": "tail -f /var/log/app.log"},
151
148
  ],
@@ -157,9 +154,14 @@ if __name__ == "__main__":
157
154
 
158
155
  try:
159
156
  # Create layout using the remote generator
160
- generator = ZellijRemoteLayoutGenerator(remote_name=remote_name, session_name_prefix=session_name)
161
- layout_path = generator.create_zellij_layout(sample_layout, None)
162
- print(f"✅ Remote layout created successfully: {layout_path}")
157
+ generator = ZellijRemoteLayoutGenerator(
158
+ layout_config=sample_layout,
159
+ remote_name=remote_name,
160
+ session_name=session_name
161
+ )
162
+ generator.create_layout_file()
163
+
164
+ print(f"✅ Remote layout created successfully: {generator.layout_path}")
163
165
 
164
166
  # Demonstrate serialization
165
167
  print("\n💾 Demonstrating serialization...")
@@ -179,10 +181,7 @@ if __name__ == "__main__":
179
181
 
180
182
  # Demonstrate status checking
181
183
  print(f"\n🔍 Checking command status on remote '{remote_name}':")
182
- if not generator.layout_config:
183
- console.print("[bold red]❌ No layout config available[/bold red]")
184
- else:
185
- generator.status_reporter.print_status_report(generator.layout_config)
184
+ generator.status_reporter.print_status_report(generator.layout_config)
186
185
 
187
186
  # Start the session (uncomment to actually start)
188
187
  # start_result = generator.start_zellij_session()
@@ -2,7 +2,7 @@ from datetime import datetime
2
2
  import json
3
3
  import uuid
4
4
  from pathlib import Path
5
- from typing import Optional, Dict
5
+ from typing import Optional
6
6
  from machineconfig.utils.scheduler import Scheduler
7
7
  from machineconfig.cluster.sessions_managers.zellij_local import run_command_in_zellij_tab
8
8
  from machineconfig.cluster.sessions_managers.zellij_remote import ZellijRemoteLayoutGenerator
@@ -10,18 +10,24 @@ from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
10
10
  from machineconfig.logger import get_logger
11
11
 
12
12
 
13
- TMP_SERIALIAZATION_DIR = Path.home().joinpath("tmp_results", "session_manager", "zellij", "remote_manager")
14
13
  logger = get_logger("cluster.sessions_managers.zellij_remote_manager")
14
+ TMP_SERIALIAZATION_DIR = Path.home() / "tmp_results" / "zellij_sessions" / "serialized"
15
15
 
16
16
 
17
17
  class ZellijSessionManager:
18
- def __init__(self, machine_layouts: Dict[str, LayoutConfig], session_name_prefix: str):
18
+ def __init__(self, machine_layouts: dict[str, LayoutConfig], session_name_prefix: str):
19
19
  self.session_name_prefix = session_name_prefix
20
20
  self.machine_layouts = machine_layouts # Store the original config
21
21
  self.managers: list[ZellijRemoteLayoutGenerator] = []
22
22
  for machine, layout_config in machine_layouts.items():
23
- an_m = ZellijRemoteLayoutGenerator(remote_name=machine, session_name_prefix=self.session_name_prefix)
24
- an_m.create_zellij_layout(layout_config=layout_config, output_dir=None)
23
+ from machineconfig.cluster.sessions_managers.zellij_utils.layout_generator import LayoutGenerator
24
+ session_name = f"{self.session_name_prefix}_{LayoutGenerator.generate_random_suffix(8)}"
25
+ an_m = ZellijRemoteLayoutGenerator(
26
+ layout_config=layout_config,
27
+ remote_name=machine,
28
+ session_name=session_name
29
+ )
30
+ an_m.create_layout_file()
25
31
  self.managers.append(an_m)
26
32
 
27
33
  def ssh_to_all_machines(self) -> str:
@@ -51,10 +57,7 @@ class ZellijSessionManager:
51
57
  if scheduler.cycle % 2 == 0:
52
58
  statuses = []
53
59
  for _idx, an_m in enumerate(self.managers):
54
- if not an_m.layout_config:
55
- a_status = {}
56
- else:
57
- a_status = an_m.process_monitor.check_all_commands_status(an_m.layout_config)
60
+ a_status = an_m.process_monitor.check_all_commands_status(an_m.layout_config)
58
61
  statuses.append(a_status)
59
62
  keys = []
60
63
  for item in statuses:
@@ -71,7 +74,7 @@ class ZellijSessionManager:
71
74
  # Check if all stopped
72
75
  running_count = sum(1 for item in status_data if item.get("status", {}).get("running", False))
73
76
  if running_count == 0: # they all stopped
74
- sched.max_cycles = sched.cycle # stop the scheduler from calling this routine again
77
+ scheduler.max_cycles = scheduler.cycle # stop the scheduler from calling this routine again
75
78
 
76
79
  # Print status
77
80
  for item in status_data:
@@ -85,8 +88,9 @@ class ZellijSessionManager:
85
88
  # Print statuses
86
89
  for i, status in enumerate(statuses):
87
90
  print(f"Manager {i}: {status}")
88
-
89
- sched = Scheduler(routine=routine, wait_ms=60_000, logger=logger)
91
+ from machineconfig.utils.scheduler import LoggerTemplate
92
+ from typing import cast
93
+ sched = Scheduler(routine=routine, wait_ms=60_000, logger=cast(LoggerTemplate, logger))
90
94
  sched.run()
91
95
 
92
96
  def save(self, session_id: Optional[str]) -> str:
@@ -17,8 +17,8 @@ def example_usage():
17
17
  sample_layout: LayoutConfig = {
18
18
  "layoutName": "ExampleRemoteSession",
19
19
  "layoutTabs": [
20
- {"tabName": "🤖Bot1", "startDir": "~/code/bytesense/bithence", "command": "~/scripts/fire -mO go1.py bot1 -- --create_new_bot=True"},
21
- {"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "~/scripts/fire -mO go2.py bot2 -- --create_new_bot=True"},
20
+ {"tabName": "🤖Bot1", "startDir": "~/code/bytesense/bithence", "command": "fire -mO go1.py bot1 -- --create_new_bot=True"},
21
+ {"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "fire -mO go2.py bot2 -- --create_new_bot=True"},
22
22
  {"tabName": "📊Monitor", "startDir": "~", "command": "htop"},
23
23
  {"tabName": "📝Logs", "startDir": "/var/log", "command": "tail -f /var/log/app.log"},
24
24
  ],
@@ -30,12 +30,8 @@ def example_usage():
30
30
 
31
31
  try:
32
32
  # Create layout using the remote generator
33
- generator = ZellijRemoteLayoutGenerator(remote_name=remote_name, session_name_prefix=session_name)
34
-
35
- # Create layout file
36
- layout_path = generator.create_zellij_layout(sample_layout, None)
37
- print(f"✅ Remote layout created successfully: {layout_path}")
38
-
33
+ generator = ZellijRemoteLayoutGenerator(remote_name=remote_name, session_name=session_name, layout_config=sample_layout)
34
+ generator.create_layout_file()
39
35
  # Preview the layout content
40
36
  preview = generator.layout_generator.generate_layout_content(sample_layout)
41
37
  print(f"📄 Layout preview:\n{preview}")
@@ -7,7 +7,6 @@ import shlex
7
7
  import random
8
8
  import string
9
9
  from typing import List, Tuple
10
- from pathlib import Path
11
10
  import logging
12
11
 
13
12
  from rich.console import Console
@@ -116,26 +115,12 @@ class LayoutGenerator:
116
115
 
117
116
  return layout_content
118
117
 
119
- def create_layout_file(self, layout_config: LayoutConfig, output_dir: Path, session_name: str) -> str:
120
- """Create a layout file and return its absolute path."""
118
+ def create_layout_file(self, layout_config: LayoutConfig, session_name: str) -> str:
119
+ """Create layout content and return it as string."""
121
120
  self.validate_tab_config(layout_config)
122
121
 
123
- # Generate unique suffix for this layout
124
- random_suffix = self.generate_random_suffix(8)
125
122
  layout_content = self.generate_layout_content(layout_config)
126
123
 
127
- try:
128
- # Create output directory if it doesn't exist
129
- output_dir.mkdir(parents=True, exist_ok=True)
130
- layout_file = output_dir / f"zellij_layout_{session_name}_{random_suffix}.kdl"
131
-
132
- # Write layout file
133
- layout_file.write_text(layout_content, encoding="utf-8")
134
-
135
- # Enhanced Rich logging
136
- console.print(f"[bold green]✅ Zellij layout file created:[/bold green] [cyan]{layout_file.absolute()}[/cyan]")
137
- return str(layout_file.absolute())
138
-
139
- except OSError as e:
140
- logger.error(f"Failed to create layout file: {e}")
141
- raise
124
+ # Enhanced Rich logging
125
+ console.print("[bold green]✅ Zellij layout content generated[/bold green]")
126
+ return layout_content
@@ -51,12 +51,10 @@ class ProcessMonitor:
51
51
  return {"status": "unknown", "error": f"Tab '{tab_name}' not found in layout config", "running": False, "command": "", "tab_name": tab_name, "processes": [], "remote": self.remote_executor.remote_name}
52
52
 
53
53
  command = tab_config["command"]
54
-
55
54
  try:
56
55
  check_script = self._create_process_check_script(command)
57
- remote_cmd = f"$HOME/code/machineconfig/.venv/bin/python -c {shlex.quote(check_script)}"
56
+ remote_cmd = f"$HOME/.local/bin devops self python -c {shlex.quote(check_script)}"
58
57
  result = self.remote_executor.run_command(remote_cmd, timeout=15)
59
-
60
58
  if result.returncode == 0:
61
59
  try:
62
60
  matching_processes = json.loads(result.stdout.strip())
@@ -127,16 +125,12 @@ if __name__ == "__main__":
127
125
 
128
126
  def force_fresh_process_check(self, tab_name: str, layout_config: LayoutConfig) -> CommandStatus:
129
127
  """Force a fresh process check with additional validation."""
130
- # Find the tab with the given name
131
- tab_config = None
132
128
  for tab in layout_config["layoutTabs"]:
133
129
  if tab["tabName"] == tab_name:
134
130
  tab_config = tab
135
131
  break
136
-
137
- if tab_config is None:
132
+ else:
138
133
  return {"status": "unknown", "error": f"Tab '{tab_name}' not found in layout config", "running": False, "command": "", "tab_name": tab_name, "processes": [], "remote": self.remote_executor.remote_name}
139
-
140
134
  command = tab_config["command"]
141
135
 
142
136
  try:
@@ -145,7 +139,7 @@ if __name__ == "__main__":
145
139
  check_timestamp = timestamp_result.stdout.strip() if timestamp_result.returncode == 0 else "unknown"
146
140
 
147
141
  check_script = self._create_fresh_check_script(command)
148
- remote_cmd = f"$HOME/code/machineconfig/.venv/bin/python -c {shlex.quote(check_script)}"
142
+ remote_cmd = f"$HOME/.local/bin/devops self python -c {shlex.quote(check_script)}"
149
143
  result = self.remote_executor.run_command(remote_cmd, timeout=15)
150
144
 
151
145
  if result.returncode == 0:
@@ -5,11 +5,13 @@ Status reporting utilities for Zellij remote layouts.
5
5
 
6
6
  import logging
7
7
  from typing import Dict, Any
8
+ from rich.console import Console
8
9
  from machineconfig.cluster.sessions_managers.zellij_utils.process_monitor import ProcessMonitor
9
10
  from machineconfig.cluster.sessions_managers.zellij_utils.session_manager import SessionManager
10
11
  from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
11
12
 
12
13
  logger = logging.getLogger(__name__)
14
+ console = Console()
13
15
 
14
16
 
15
17
  class StatusReporter:
@@ -70,7 +72,7 @@ class StatusReporter:
70
72
  print(f"✅ {tab_name}: Running on {remote_name}")
71
73
  if cmd_status.get("processes"):
72
74
  for proc in cmd_status["processes"][:2]: # Show first 2 processes
73
- print(f" └─ PID {proc['pid']}: {proc['name']} ({proc['status']})")
75
+ console.print(f" [dim]└─[/dim] PID {proc['pid']}: {proc['name']} ({proc['status']})")
74
76
  else:
75
77
  print(f"❌ {tab_name}: Not running on {remote_name}")
76
78
  print(f" Command: {cmd_status.get('command', 'Unknown')}")