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
@@ -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,26 +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
-
124
- cmd = f"zellij delete-session --force {session_name}"
125
-
126
- logger.info(f"Killing session '{session_name}'")
127
- result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=10)
128
-
129
- results[session_name] = {"success": result.returncode == 0, "message": "Session killed" if result.returncode == 0 else result.stderr}
130
-
131
- except Exception as e:
132
- # Use a fallback key since session_name might not be defined here
133
- key = getattr(manager, "session_name", None) or f"manager_{self.managers.index(manager)}"
134
- results[key] = {"success": False, "error": str(e)}
135
-
136
- return results
114
+ return helper.kill_all_sessions(self.managers)
137
115
 
138
116
  def attach_to_session(self, session_name: Optional[str]) -> str:
139
117
  """
@@ -145,20 +123,7 @@ class ZellijLocalManager:
145
123
  Returns:
146
124
  Command string to attach to session(s)
147
125
  """
148
- if session_name:
149
- # Find the specific session
150
- for manager in self.managers:
151
- if manager.session_name == session_name:
152
- return f"zellij attach {session_name}"
153
- raise ValueError(f"Session '{session_name}' not found")
154
- else:
155
- # Return commands for all sessions
156
- commands: list[str] = []
157
- for manager in self.managers:
158
- commands.append(f"# Attach to session '{manager.session_name}':")
159
- commands.append(f"zellij attach {manager.session_name}")
160
- commands.append("")
161
- return "\n".join(commands)
126
+ return helper.attach_to_session(self.managers, session_name)
162
127
 
163
128
  def check_all_sessions_status(self) -> dict[str, SessionReport]:
164
129
  """Check the status of all sessions and their commands."""
@@ -166,11 +131,10 @@ class ZellijLocalManager:
166
131
 
167
132
  for manager in self.managers:
168
133
  session_name = manager.session_name
169
- if session_name is None:
170
- continue # Skip managers without a session name
171
134
 
172
- # Get session status
173
- 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)
174
138
 
175
139
  # Get commands status for this session
176
140
  commands_status = manager.check_all_commands_status()
@@ -248,7 +212,7 @@ class ZellijLocalManager:
248
212
 
249
213
  if cmd_status.get("processes"):
250
214
  for proc in cmd_status["processes"][:2]: # Show first 2 processes
251
- print(f" └─ PID {proc['pid']}: {proc['name']} ({proc['status']})")
215
+ console.print(f" [dim]└─[/dim] PID {proc['pid']}: {proc['name']} ({proc['status']})")
252
216
  print()
253
217
 
254
218
  print("=" * 80)
@@ -317,143 +281,29 @@ class ZellijLocalManager:
317
281
 
318
282
  def save(self, session_id: Optional[str]) -> str:
319
283
  """Save the manager state to disk."""
320
- if session_id is None:
321
- session_id = str(uuid.uuid4())[:8]
322
-
323
- # Create session directory
324
- session_dir = TMP_SERIALIZATION_DIR / session_id
325
- session_dir.mkdir(parents=True, exist_ok=True)
326
-
327
- # Save the session_layouts configuration
328
- config_file = session_dir / "session_layouts.json"
329
- text = json.dumps(self.session_layouts, indent=2, ensure_ascii=False)
330
- config_file.write_text(text, encoding="utf-8")
331
-
332
- # Save metadata
333
- 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"}
334
- metadata_file = session_dir / "metadata.json"
335
- text = json.dumps(metadata, indent=2, ensure_ascii=False)
336
- metadata_file.write_text(text, encoding="utf-8")
337
-
338
- # Save each manager's state
339
- managers_dir = session_dir / "managers"
340
- managers_dir.mkdir(exist_ok=True)
341
-
342
- for i, manager in enumerate(self.managers):
343
- manager_data = {"session_name": manager.session_name, "layout_config": manager.layout_config, "layout_path": manager.layout_path}
344
- manager_file = managers_dir / f"manager_{i}_{manager.session_name}.json"
345
- text = json.dumps(manager_data, indent=2, ensure_ascii=False)
346
- manager_file.write_text(text, encoding="utf-8")
347
-
348
- logger.info(f"✅ Saved ZellijLocalManager session to: {session_dir}")
349
- return session_id
284
+ return helper.save_manager(self.session_layouts, self.managers, self.session_name_prefix, session_id)
350
285
 
351
286
  @classmethod
352
287
  def load(cls, session_id: str) -> "ZellijLocalManager":
353
288
  """Load a saved manager state from disk."""
354
- session_dir = TMP_SERIALIZATION_DIR / session_id
355
-
356
- if not session_dir.exists():
357
- raise FileNotFoundError(f"Session directory not found: {session_dir}")
358
-
359
- # Load configuration
360
- config_file = session_dir / "session_layouts.json"
361
- if not config_file.exists():
362
- raise FileNotFoundError(f"Configuration file not found: {config_file}")
363
-
364
- text = config_file.read_text(encoding="utf-8")
365
- session_layouts = json.loads(text)
366
-
367
- # Create new instance
289
+ session_layouts, managers = helper.load_manager(session_id)
368
290
  instance = cls(session_layouts=session_layouts)
369
-
370
- # Load saved manager states
371
- managers_dir = session_dir / "managers"
372
- if managers_dir.exists():
373
- instance.managers = []
374
- manager_files = sorted(managers_dir.glob("manager_*.json"))
375
-
376
- for manager_file in manager_files:
377
- try:
378
- text = manager_file.read_text(encoding="utf-8")
379
- manager_data = json.loads(text)
380
-
381
- # Recreate the manager
382
- manager = ZellijLayoutGenerator()
383
- manager.session_name = manager_data["session_name"]
384
- manager.layout_config = manager_data["layout_config"]
385
- manager.layout_path = manager_data["layout_path"]
386
-
387
- instance.managers.append(manager)
388
-
389
- except Exception as e:
390
- logger.warning(f"Failed to load manager from {manager_file}: {e}")
391
-
392
- logger.info(f"✅ Loaded ZellijLocalManager session from: {session_dir}")
291
+ instance.managers = managers
393
292
  return instance
394
293
 
395
294
  @staticmethod
396
- def list_saved_sessions() -> List[str]:
295
+ def list_saved_sessions() -> list[str]:
397
296
  """List all saved session IDs."""
398
- if not TMP_SERIALIZATION_DIR.exists():
399
- return []
400
-
401
- sessions = []
402
- for item in TMP_SERIALIZATION_DIR.iterdir():
403
- if item.is_dir() and (item / "metadata.json").exists():
404
- sessions.append(item.name)
405
-
406
- return sorted(sessions)
297
+ return helper.list_saved_sessions()
407
298
 
408
299
  @staticmethod
409
300
  def delete_session(session_id: str) -> bool:
410
301
  """Delete a saved session."""
411
- session_dir = TMP_SERIALIZATION_DIR / session_id
412
-
413
- if not session_dir.exists():
414
- logger.warning(f"Session directory not found: {session_dir}")
415
- return False
416
-
417
- try:
418
- import shutil
419
-
420
- shutil.rmtree(session_dir)
421
- logger.info(f"✅ Deleted session: {session_id}")
422
- return True
423
- except Exception as e:
424
- logger.error(f"Failed to delete session {session_id}: {e}")
425
- return False
302
+ return helper.delete_session(session_id)
426
303
 
427
304
  def list_active_sessions(self) -> list[ActiveSessionInfo]:
428
305
  """List currently active zellij sessions managed by this instance."""
429
- active_sessions: list[ActiveSessionInfo] = []
430
-
431
- try:
432
- # Get all running zellij sessions
433
- result = subprocess.run(["zellij", "list-sessions"], capture_output=True, text=True, timeout=10)
434
-
435
- if result.returncode == 0:
436
- all_sessions = result.stdout.strip().split("\n") if result.stdout.strip() else []
437
-
438
- # Filter to only our managed sessions
439
- for manager in self.managers:
440
- session_name = manager.session_name
441
- if session_name is None:
442
- continue # Skip managers without a session name
443
- is_active = any(session_name in session for session in all_sessions)
444
-
445
- tab_info = []
446
- tab_count = 0
447
- if manager.layout_config:
448
- tab_count = len(manager.layout_config["layoutTabs"])
449
- tab_info = [tab["tabName"] for tab in manager.layout_config["layoutTabs"]]
450
-
451
- active_sessions.append({"session_name": session_name, "is_active": is_active, "tab_count": tab_count, "tabs": tab_info})
452
-
453
- except Exception as e:
454
- logger.error(f"Error listing active sessions: {e}")
455
-
456
- return active_sessions
306
+ return helper.list_active_sessions(self.managers)
457
307
 
458
308
 
459
309
  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 --kw create_new_bot True"},
148
- {"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "~/scripts/fire -mO go2.py bot2 --kw 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:
@@ -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 --kw create_new_bot True"},
21
- {"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "~/scripts/fire -mO go2.py bot2 --kw 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 run-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 run-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')}")