machineconfig 5.15__py3-none-any.whl → 7.66__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 (389) 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 +0 -1
  5. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  6. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  7. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  8. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  9. machineconfig/cluster/sessions_managers/wt_local_manager.py +50 -193
  10. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  11. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  12. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  13. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  14. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  17. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  18. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  19. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -169
  20. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  21. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  22. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  23. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  24. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  25. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  26. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  30. machineconfig/jobs/{python → installer}/check_installations.py +2 -3
  31. machineconfig/jobs/installer/custom/boxes.py +61 -0
  32. machineconfig/jobs/installer/custom/hx.py +76 -19
  33. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  34. machineconfig/jobs/installer/custom_dev/brave.py +1 -7
  35. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  36. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  37. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  38. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +9 -18
  39. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  40. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  41. machineconfig/jobs/installer/installer_data.json +1101 -115
  42. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  43. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  44. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  45. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  46. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  47. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  48. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  49. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  50. machineconfig/jobs/installer/linux_scripts/q.sh +1 -0
  51. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  52. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  53. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  54. machineconfig/jobs/installer/package_groups.py +108 -180
  55. machineconfig/logger.py +0 -1
  56. machineconfig/profile/backup.toml +49 -0
  57. machineconfig/profile/bash_shell_profiles.md +11 -0
  58. machineconfig/profile/create_helper.py +74 -0
  59. machineconfig/profile/create_links.py +288 -0
  60. machineconfig/profile/create_links_export.py +100 -0
  61. machineconfig/profile/create_shell_profile.py +136 -0
  62. machineconfig/profile/mapper.toml +258 -0
  63. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
  64. machineconfig/scripts/__init__.py +0 -4
  65. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  66. machineconfig/scripts/linux/wrap_mcfg +47 -0
  67. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  68. machineconfig/scripts/python/agents.py +92 -103
  69. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  70. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  71. machineconfig/scripts/python/ai/generate_files.py +307 -42
  72. machineconfig/scripts/python/ai/initai.py +3 -28
  73. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  74. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  75. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  76. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  77. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  78. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  79. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  80. machineconfig/scripts/python/cloud.py +29 -0
  81. machineconfig/scripts/python/croshell.py +111 -114
  82. machineconfig/scripts/python/define.py +31 -0
  83. machineconfig/scripts/python/devops.py +44 -103
  84. machineconfig/scripts/python/devops_navigator.py +10 -0
  85. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  86. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  87. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  88. machineconfig/scripts/python/explore.py +49 -0
  89. machineconfig/scripts/python/fire_jobs.py +115 -152
  90. machineconfig/scripts/python/ftpx.py +29 -24
  91. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  92. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  93. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  94. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  95. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  96. machineconfig/scripts/python/{fire_agents_help_launch.py → helpers_agents/fire_agents_help_launch.py} +34 -44
  97. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  98. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  99. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  100. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  101. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  102. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +10 -18
  103. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  104. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  105. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  106. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +2 -2
  107. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  108. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  109. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  110. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  111. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  112. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  113. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  114. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  115. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_terminal.py} +35 -23
  116. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  117. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  118. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  119. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  120. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  121. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  122. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  123. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  124. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  125. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  126. machineconfig/scripts/python/{fire_jobs_route_helper.py → helpers_fire_command/fire_jobs_route_helper.py} +47 -2
  127. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  128. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  129. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  130. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  131. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  132. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  133. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  134. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  135. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  136. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  137. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  138. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  139. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  140. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  141. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  142. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  143. machineconfig/scripts/python/{count_lines.py → helpers_repos/count_lines.py} +10 -10
  144. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  145. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  146. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  147. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  148. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  149. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  150. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  151. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  152. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  153. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  154. machineconfig/scripts/python/interactive.py +64 -84
  155. machineconfig/scripts/python/machineconfig.py +63 -0
  156. machineconfig/scripts/python/msearch.py +21 -0
  157. machineconfig/scripts/python/nw/__init__.py +0 -0
  158. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +0 -2
  159. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +73 -43
  160. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  161. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +3 -3
  162. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  163. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +3 -3
  164. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  165. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  166. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  167. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  168. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +5 -4
  169. machineconfig/scripts/python/sessions.py +64 -44
  170. machineconfig/scripts/python/terminal.py +127 -0
  171. machineconfig/scripts/python/utils.py +66 -0
  172. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  173. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  174. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  175. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  176. machineconfig/settings/broot/br.sh +0 -4
  177. machineconfig/settings/broot/conf.toml +1 -1
  178. machineconfig/settings/helix/config.toml +16 -0
  179. machineconfig/settings/helix/languages.toml +13 -4
  180. machineconfig/settings/helix/yazi-picker.sh +12 -0
  181. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  182. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  183. machineconfig/settings/lf/linux/lfrc +10 -12
  184. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  185. machineconfig/settings/lf/windows/lfrc +18 -38
  186. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  187. machineconfig/settings/linters/.ruff.toml +1 -1
  188. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  189. machineconfig/settings/marimo/marimo.toml +80 -0
  190. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  191. machineconfig/settings/pistol/pistol.conf +1 -1
  192. machineconfig/settings/shells/bash/init.sh +55 -31
  193. machineconfig/settings/shells/nushell/config.nu +1 -34
  194. machineconfig/settings/shells/nushell/init.nu +127 -0
  195. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  196. machineconfig/settings/shells/starship/starship.toml +16 -0
  197. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  198. machineconfig/settings/shells/wt/settings.json +32 -17
  199. machineconfig/settings/shells/zsh/init.sh +89 -0
  200. machineconfig/settings/svim/linux/init.toml +0 -4
  201. machineconfig/settings/svim/windows/init.toml +0 -3
  202. machineconfig/settings/yazi/init.lua +57 -0
  203. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  204. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  205. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  206. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  207. machineconfig/settings/yazi/yazi.toml +13 -0
  208. machineconfig/setup_linux/__init__.py +10 -0
  209. machineconfig/setup_linux/apps_desktop.sh +89 -0
  210. machineconfig/setup_linux/apps_gui.sh +64 -0
  211. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  212. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  213. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  214. machineconfig/setup_linux/uv.sh +15 -0
  215. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  216. machineconfig/setup_mac/__init__.py +16 -0
  217. machineconfig/setup_mac/apps_gui.sh +248 -0
  218. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  219. machineconfig/setup_mac/uv.sh +36 -0
  220. machineconfig/setup_windows/__init__.py +8 -0
  221. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  222. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  223. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  224. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  225. machineconfig/setup_windows/uv.ps1 +10 -0
  226. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  227. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  228. machineconfig/utils/accessories.py +7 -5
  229. machineconfig/utils/cloud/onedrive/README.md +139 -0
  230. machineconfig/utils/code.py +133 -106
  231. machineconfig/utils/files/art/fat_croco.txt +10 -0
  232. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  233. machineconfig/utils/files/art/happy_croco.txt +22 -0
  234. machineconfig/utils/files/art/water_croco.txt +11 -0
  235. machineconfig/utils/files/ascii_art.py +1 -1
  236. machineconfig/utils/files/dbms.py +257 -0
  237. machineconfig/utils/files/headers.py +11 -14
  238. machineconfig/utils/files/ouch/__init__.py +0 -0
  239. machineconfig/utils/files/ouch/decompress.py +45 -0
  240. machineconfig/utils/files/read.py +10 -18
  241. machineconfig/utils/installer_utils/installer_class.py +68 -126
  242. machineconfig/utils/installer_utils/{installer.py → installer_cli.py} +109 -117
  243. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +31 -81
  244. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +44 -74
  245. machineconfig/utils/io.py +77 -23
  246. machineconfig/utils/links.py +254 -162
  247. machineconfig/utils/meta.py +255 -0
  248. machineconfig/utils/notifications.py +1 -1
  249. machineconfig/utils/options.py +13 -3
  250. machineconfig/utils/path_extended.py +46 -100
  251. machineconfig/utils/path_helper.py +75 -22
  252. machineconfig/utils/procs.py +50 -70
  253. machineconfig/utils/scheduler.py +94 -97
  254. machineconfig/utils/scheduling.py +0 -3
  255. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  256. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  257. machineconfig/utils/source_of_truth.py +3 -6
  258. machineconfig/utils/ssh.py +742 -264
  259. machineconfig/utils/ssh_utils/utils.py +0 -0
  260. machineconfig/utils/terminal.py +2 -113
  261. machineconfig/utils/tst.py +20 -0
  262. machineconfig/utils/upgrade_packages.py +109 -28
  263. machineconfig/utils/ve.py +11 -4
  264. machineconfig-7.66.dist-info/METADATA +124 -0
  265. machineconfig-7.66.dist-info/RECORD +451 -0
  266. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  267. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  268. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  269. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  270. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  271. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  272. machineconfig/jobs/python/vscode/api.py +0 -57
  273. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  274. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  275. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  276. machineconfig/jobs/windows/startup_file.cmd +0 -2
  277. machineconfig/profile/create.py +0 -303
  278. machineconfig/profile/shell.py +0 -176
  279. machineconfig/scripts/cloud/init.sh +0 -119
  280. machineconfig/scripts/linux/agents +0 -2
  281. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  282. machineconfig/scripts/linux/cloud_copy +0 -2
  283. machineconfig/scripts/linux/cloud_mount +0 -2
  284. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  285. machineconfig/scripts/linux/cloud_sync +0 -2
  286. machineconfig/scripts/linux/croshell +0 -3
  287. machineconfig/scripts/linux/devops +0 -2
  288. machineconfig/scripts/linux/fire +0 -2
  289. machineconfig/scripts/linux/ftpx +0 -2
  290. machineconfig/scripts/linux/fzf2g +0 -21
  291. machineconfig/scripts/linux/fzffg +0 -25
  292. machineconfig/scripts/linux/gh_models +0 -2
  293. machineconfig/scripts/linux/initai +0 -2
  294. machineconfig/scripts/linux/kill_process +0 -2
  295. machineconfig/scripts/linux/scheduler +0 -2
  296. machineconfig/scripts/linux/sessions +0 -2
  297. machineconfig/scripts/linux/share_smb +0 -1
  298. machineconfig/scripts/linux/start_slidev +0 -2
  299. machineconfig/scripts/linux/start_terminals +0 -3
  300. machineconfig/scripts/linux/warp-cli.sh +0 -122
  301. machineconfig/scripts/linux/wifi_conn +0 -2
  302. machineconfig/scripts/linux/z_ls +0 -104
  303. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  304. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  305. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  306. machineconfig/scripts/python/dotfile.py +0 -78
  307. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  308. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  309. machineconfig/scripts/python/gh_models.py +0 -104
  310. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  311. machineconfig/scripts/python/repos.py +0 -132
  312. machineconfig/scripts/python/repos_helper_action.py +0 -378
  313. machineconfig/scripts/python/snapshot.py +0 -25
  314. machineconfig/scripts/python/start_terminals.py +0 -121
  315. machineconfig/scripts/python/t4.py +0 -17
  316. machineconfig/scripts/windows/agents.ps1 +0 -1
  317. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  318. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  319. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  320. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  321. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  322. machineconfig/scripts/windows/croshell.ps1 +0 -1
  323. machineconfig/scripts/windows/devops.ps1 +0 -1
  324. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  325. machineconfig/scripts/windows/fire.ps1 +0 -1
  326. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  327. machineconfig/scripts/windows/gpt.ps1 +0 -1
  328. machineconfig/scripts/windows/grep.ps1 +0 -2
  329. machineconfig/scripts/windows/initai.ps1 +0 -1
  330. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  331. machineconfig/scripts/windows/nano.ps1 +0 -3
  332. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  333. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  334. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  335. machineconfig/scripts/windows/sessions.ps1 +0 -1
  336. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  337. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  338. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  339. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  340. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  341. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  342. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  343. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  344. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  345. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  346. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  347. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  348. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  349. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  350. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  351. machineconfig-5.15.dist-info/METADATA +0 -188
  352. machineconfig-5.15.dist-info/RECORD +0 -415
  353. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  354. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  355. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  356. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  357. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  358. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  359. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  360. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  361. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  362. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  363. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  364. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  365. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  366. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  367. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  368. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  369. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  370. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  371. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  372. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  373. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  374. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  375. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  376. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  377. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  378. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  379. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  380. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  381. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  382. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  383. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  384. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  385. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  386. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  387. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  388. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  389. {machineconfig-5.15.dist-info → machineconfig-7.66.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)
@@ -314,143 +281,29 @@ class ZellijLocalManager:
314
281
 
315
282
  def save(self, session_id: Optional[str]) -> str:
316
283
  """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
284
+ return helper.save_manager(self.session_layouts, self.managers, self.session_name_prefix, session_id)
347
285
 
348
286
  @classmethod
349
287
  def load(cls, session_id: str) -> "ZellijLocalManager":
350
288
  """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
289
+ session_layouts, managers = helper.load_manager(session_id)
365
290
  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}")
291
+ instance.managers = managers
390
292
  return instance
391
293
 
392
294
  @staticmethod
393
- def list_saved_sessions() -> List[str]:
295
+ def list_saved_sessions() -> list[str]:
394
296
  """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)
297
+ return helper.list_saved_sessions()
404
298
 
405
299
  @staticmethod
406
300
  def delete_session(session_id: str) -> bool:
407
301
  """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
302
+ return helper.delete_session(session_id)
423
303
 
424
304
  def list_active_sessions(self) -> list[ActiveSessionInfo]:
425
305
  """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
306
+ return helper.list_active_sessions(self.managers)
454
307
 
455
308
 
456
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 -- --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:
@@ -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 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')}")