machineconfig 5.15__py3-none-any.whl → 7.98__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/cloud_manager.py +1 -1
  3. machineconfig/cluster/remote/distribute.py +0 -1
  4. machineconfig/cluster/remote/file_manager.py +0 -2
  5. machineconfig/cluster/remote/script_execution.py +0 -1
  6. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +70 -210
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +52 -198
  13. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  14. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  17. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  18. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  19. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  20. machineconfig/cluster/sessions_managers/zellij_local_manager.py +25 -170
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +16 -12
  23. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  24. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  25. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  26. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  31. machineconfig/jobs/{python → installer}/check_installations.py +2 -3
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/hx.py +76 -19
  34. machineconfig/jobs/installer/custom/yazi.py +119 -0
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  36. machineconfig/jobs/installer/custom_dev/brave.py +5 -9
  37. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  38. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  39. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  40. machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
  41. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +33 -28
  42. machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
  43. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  44. machineconfig/jobs/installer/custom_dev/winget.py +10 -14
  45. machineconfig/jobs/installer/installer_data.json +1487 -229
  46. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  47. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  48. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  49. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  50. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  51. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  52. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  53. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  54. machineconfig/jobs/installer/linux_scripts/q.sh +10 -6
  55. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  56. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  57. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  58. machineconfig/jobs/installer/package_groups.py +106 -177
  59. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  60. machineconfig/logger.py +0 -1
  61. machineconfig/profile/backup.toml +49 -0
  62. machineconfig/profile/bash_shell_profiles.md +11 -0
  63. machineconfig/profile/create_helper.py +62 -0
  64. machineconfig/profile/create_links.py +288 -0
  65. machineconfig/profile/create_links_export.py +100 -0
  66. machineconfig/profile/create_shell_profile.py +147 -0
  67. machineconfig/profile/mapper.toml +263 -0
  68. machineconfig/scripts/__init__.py +0 -4
  69. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  70. machineconfig/scripts/linux/wrap_mcfg +46 -0
  71. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  72. machineconfig/scripts/python/agents.py +123 -117
  73. machineconfig/scripts/python/ai/initai.py +3 -28
  74. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  75. machineconfig/scripts/python/ai/scripts/command_runner.sh +9 -0
  76. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  77. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  78. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  79. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  80. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  81. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  82. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  83. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +5 -1
  84. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  85. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  86. machineconfig/scripts/python/ai/solutions/generic.py +28 -5
  87. machineconfig/scripts/python/ai/utils/generate_files.py +348 -0
  88. machineconfig/scripts/python/ai/utils/vscode_tasks.py +37 -0
  89. machineconfig/scripts/python/cloud.py +29 -0
  90. machineconfig/scripts/python/croshell.py +137 -113
  91. machineconfig/scripts/python/devops.py +61 -101
  92. machineconfig/scripts/python/devops_navigator.py +6 -0
  93. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  94. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  95. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  96. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  97. machineconfig/scripts/python/fire_jobs.py +110 -150
  98. machineconfig/scripts/python/ftpx.py +51 -24
  99. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  100. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  101. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  102. machineconfig/scripts/python/helpers/run_py_script.py +79 -0
  103. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  104. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  106. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  107. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  108. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  109. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  110. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +126 -0
  111. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  112. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  113. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  114. machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
  115. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  116. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +29 -35
  117. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  118. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  119. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  120. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +8 -9
  121. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  122. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  123. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  124. machineconfig/scripts/python/helpers_devops/cli_nw.py +214 -0
  125. machineconfig/scripts/python/helpers_devops/cli_repos.py +215 -0
  126. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  127. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  128. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  129. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_share_terminal.py} +45 -35
  130. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  131. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  132. machineconfig/scripts/python/helpers_devops/devops_status.py +499 -0
  133. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  134. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  135. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  136. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +3 -3
  137. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  138. machineconfig/scripts/python/helpers_fire_command/f.py +0 -0
  139. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  140. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  141. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +121 -0
  142. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  143. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  144. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  145. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  146. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  147. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  148. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  149. machineconfig/scripts/python/helpers_navigator/command_tree.py +620 -0
  150. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  151. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  152. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  153. machineconfig/scripts/python/helpers_network/__init__.py +0 -0
  154. machineconfig/scripts/python/helpers_network/address.py +132 -0
  155. machineconfig/scripts/python/{devops_add_identity.py → helpers_network/devops_add_identity.py} +0 -2
  156. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +153 -0
  157. machineconfig/scripts/{linux → python/helpers_network}/mount_nfs +0 -1
  158. machineconfig/scripts/python/{mount_nfs.py → helpers_network/mount_nfs.py} +3 -3
  159. machineconfig/scripts/{linux → python/helpers_network}/mount_nw_drive +1 -2
  160. machineconfig/scripts/python/{mount_ssh.py → helpers_network/mount_ssh.py} +3 -3
  161. machineconfig/scripts/python/{onetimeshare.py → helpers_network/onetimeshare.py} +0 -1
  162. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +391 -0
  163. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +338 -0
  164. machineconfig/scripts/python/{wifi_conn.py → helpers_network/wifi_conn.py} +1 -53
  165. machineconfig/scripts/python/{wsl_windows_transfer.py → helpers_network/wsl_windows_transfer.py} +5 -4
  166. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  167. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  168. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  169. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  170. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  171. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  172. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  173. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  174. machineconfig/scripts/python/{count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  175. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  176. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  177. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  178. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +65 -0
  179. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  180. machineconfig/scripts/python/helpers_utils/path.py +185 -0
  181. machineconfig/scripts/python/interactive.py +64 -84
  182. machineconfig/scripts/python/mcfg_entry.py +58 -0
  183. machineconfig/scripts/python/msearch.py +71 -0
  184. machineconfig/scripts/python/sessions.py +119 -45
  185. machineconfig/scripts/python/terminal.py +133 -0
  186. machineconfig/scripts/python/utils.py +64 -0
  187. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
  188. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  189. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  190. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  191. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  192. machineconfig/settings/broot/br.sh +0 -4
  193. machineconfig/settings/broot/conf.toml +1 -1
  194. machineconfig/settings/helix/config.toml +16 -0
  195. machineconfig/settings/helix/languages.toml +13 -4
  196. machineconfig/settings/helix/yazi-picker.sh +12 -0
  197. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  198. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  199. machineconfig/settings/lf/linux/lfrc +10 -12
  200. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  201. machineconfig/settings/lf/windows/lfrc +18 -38
  202. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  203. machineconfig/settings/linters/.ruff.toml +1 -1
  204. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  205. machineconfig/settings/marimo/marimo.toml +80 -0
  206. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  207. machineconfig/settings/pistol/pistol.conf +1 -1
  208. machineconfig/settings/shells/bash/init.sh +82 -31
  209. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  210. machineconfig/settings/shells/nushell/config.nu +2 -35
  211. machineconfig/settings/shells/nushell/env.nu +45 -6
  212. machineconfig/settings/shells/nushell/init.nu +314 -0
  213. machineconfig/settings/shells/pwsh/init.ps1 +61 -43
  214. machineconfig/settings/shells/starship/starship.toml +16 -0
  215. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  216. machineconfig/settings/shells/wt/settings.json +32 -17
  217. machineconfig/settings/shells/zsh/init.sh +89 -0
  218. machineconfig/settings/svim/linux/init.toml +0 -4
  219. machineconfig/settings/svim/windows/init.toml +0 -3
  220. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  221. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  222. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  223. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  224. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  225. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  226. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  227. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  228. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  229. machineconfig/settings/television/cable_unix/env.toml +17 -0
  230. machineconfig/settings/television/cable_unix/files.toml +11 -0
  231. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  232. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  233. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  234. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  235. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  236. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  237. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  238. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  239. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  240. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  241. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  242. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  243. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  244. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  245. machineconfig/settings/television/cable_unix/text.toml +17 -0
  246. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  247. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  248. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  249. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  250. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  251. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  252. machineconfig/settings/television/cable_windows/env.toml +17 -0
  253. machineconfig/settings/television/cable_windows/files.toml +14 -0
  254. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  255. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  256. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  257. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  258. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  259. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  260. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  261. machineconfig/settings/television/cable_windows/text.toml +17 -0
  262. machineconfig/settings/yazi/init.lua +61 -0
  263. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  264. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  265. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  266. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  267. machineconfig/settings/yazi/theme.toml +4 -0
  268. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  269. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  270. machineconfig/setup_linux/__init__.py +11 -0
  271. machineconfig/setup_linux/apps_desktop.sh +89 -0
  272. machineconfig/setup_linux/apps_gui.sh +64 -0
  273. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  274. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  275. machineconfig/setup_linux/uv.sh +15 -0
  276. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  277. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  278. machineconfig/setup_mac/__init__.py +16 -0
  279. machineconfig/setup_mac/apps_gui.sh +248 -0
  280. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  281. machineconfig/setup_mac/uv.sh +36 -0
  282. machineconfig/setup_windows/__init__.py +11 -0
  283. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  284. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  285. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  286. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  287. machineconfig/setup_windows/uv.ps1 +17 -0
  288. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  289. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  290. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  291. machineconfig/utils/accessories.py +7 -5
  292. machineconfig/utils/cloud/onedrive/README.md +139 -0
  293. machineconfig/utils/code.py +155 -105
  294. machineconfig/utils/files/art/fat_croco.txt +10 -0
  295. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  296. machineconfig/utils/files/art/happy_croco.txt +22 -0
  297. machineconfig/utils/files/art/water_croco.txt +11 -0
  298. machineconfig/utils/files/ascii_art.py +1 -1
  299. machineconfig/utils/files/dbms.py +257 -0
  300. machineconfig/utils/files/headers.py +11 -14
  301. machineconfig/utils/files/ouch/__init__.py +0 -0
  302. machineconfig/utils/files/ouch/decompress.py +45 -0
  303. machineconfig/utils/files/read.py +10 -18
  304. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  305. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  306. machineconfig/utils/installer_utils/installer_class.py +64 -181
  307. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  308. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  309. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +66 -97
  310. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +49 -82
  311. machineconfig/utils/io.py +77 -23
  312. machineconfig/utils/links.py +254 -162
  313. machineconfig/utils/meta.py +256 -0
  314. machineconfig/utils/notifications.py +1 -1
  315. machineconfig/utils/options.py +46 -18
  316. machineconfig/utils/options_tv.py +119 -0
  317. machineconfig/utils/path_extended.py +48 -101
  318. machineconfig/utils/path_helper.py +76 -23
  319. machineconfig/utils/procs.py +50 -70
  320. machineconfig/utils/scheduler.py +88 -124
  321. machineconfig/utils/scheduling.py +0 -3
  322. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  323. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  324. machineconfig/utils/source_of_truth.py +3 -6
  325. machineconfig/utils/ssh.py +263 -274
  326. machineconfig/utils/ssh_utils/abc.py +5 -0
  327. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  328. machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
  329. machineconfig/utils/ssh_utils/utils.py +142 -0
  330. machineconfig/utils/ssh_utils/wsl.py +210 -0
  331. machineconfig/utils/terminal.py +3 -113
  332. machineconfig/utils/tst.py +20 -0
  333. machineconfig/utils/upgrade_packages.py +114 -28
  334. machineconfig/utils/ve.py +12 -4
  335. machineconfig-7.98.dist-info/METADATA +132 -0
  336. machineconfig-7.98.dist-info/RECORD +504 -0
  337. machineconfig-7.98.dist-info/entry_points.txt +13 -0
  338. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  339. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  340. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  341. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  342. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  343. machineconfig/jobs/python/vscode/api.py +0 -57
  344. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  345. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  346. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  347. machineconfig/jobs/windows/startup_file.cmd +0 -2
  348. machineconfig/profile/create.py +0 -303
  349. machineconfig/profile/shell.py +0 -176
  350. machineconfig/scripts/cloud/init.sh +0 -119
  351. machineconfig/scripts/linux/agents +0 -2
  352. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  353. machineconfig/scripts/linux/cloud_copy +0 -2
  354. machineconfig/scripts/linux/cloud_mount +0 -2
  355. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  356. machineconfig/scripts/linux/cloud_sync +0 -2
  357. machineconfig/scripts/linux/croshell +0 -3
  358. machineconfig/scripts/linux/devops +0 -2
  359. machineconfig/scripts/linux/fire +0 -2
  360. machineconfig/scripts/linux/ftpx +0 -2
  361. machineconfig/scripts/linux/fzf2g +0 -21
  362. machineconfig/scripts/linux/fzfag +0 -17
  363. machineconfig/scripts/linux/fzffg +0 -25
  364. machineconfig/scripts/linux/fzfrga +0 -21
  365. machineconfig/scripts/linux/gh_models +0 -2
  366. machineconfig/scripts/linux/initai +0 -2
  367. machineconfig/scripts/linux/kill_process +0 -2
  368. machineconfig/scripts/linux/scheduler +0 -2
  369. machineconfig/scripts/linux/sessions +0 -2
  370. machineconfig/scripts/linux/share_smb +0 -1
  371. machineconfig/scripts/linux/skrg +0 -4
  372. machineconfig/scripts/linux/start_slidev +0 -2
  373. machineconfig/scripts/linux/start_terminals +0 -3
  374. machineconfig/scripts/linux/warp-cli.sh +0 -122
  375. machineconfig/scripts/linux/wifi_conn +0 -2
  376. machineconfig/scripts/linux/z_ls +0 -104
  377. machineconfig/scripts/python/ai/generate_files.py +0 -83
  378. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  379. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  380. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  381. machineconfig/scripts/python/devops_add_ssh_key.py +0 -120
  382. machineconfig/scripts/python/dotfile.py +0 -78
  383. machineconfig/scripts/python/fire_agents_help_launch.py +0 -120
  384. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  385. machineconfig/scripts/python/fire_jobs_route_helper.py +0 -65
  386. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  387. machineconfig/scripts/python/gh_models.py +0 -104
  388. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  389. machineconfig/scripts/python/repos.py +0 -132
  390. machineconfig/scripts/python/repos_helper_action.py +0 -378
  391. machineconfig/scripts/python/snapshot.py +0 -25
  392. machineconfig/scripts/python/start_terminals.py +0 -121
  393. machineconfig/scripts/python/t4.py +0 -17
  394. machineconfig/scripts/windows/agents.ps1 +0 -1
  395. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  396. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  397. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  398. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  399. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  400. machineconfig/scripts/windows/croshell.ps1 +0 -1
  401. machineconfig/scripts/windows/devops.ps1 +0 -1
  402. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  403. machineconfig/scripts/windows/fire.ps1 +0 -1
  404. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  405. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  406. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  407. machineconfig/scripts/windows/fzfrga.bat +0 -20
  408. machineconfig/scripts/windows/gpt.ps1 +0 -1
  409. machineconfig/scripts/windows/grep.ps1 +0 -2
  410. machineconfig/scripts/windows/initai.ps1 +0 -1
  411. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  412. machineconfig/scripts/windows/nano.ps1 +0 -3
  413. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  414. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  415. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  416. machineconfig/scripts/windows/sessions.ps1 +0 -1
  417. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  418. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  419. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  420. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  421. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  422. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  423. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  424. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  425. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  426. machineconfig/settings/yazi/yazi.toml +0 -4
  427. machineconfig/setup_linux/nix/cli_installation.sh +0 -157
  428. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  429. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  430. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  431. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  432. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  433. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  434. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  435. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  436. machineconfig/utils/installer_utils/installer.py +0 -189
  437. machineconfig-5.15.dist-info/METADATA +0 -188
  438. machineconfig-5.15.dist-info/RECORD +0 -415
  439. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  440. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  441. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  442. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  443. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  444. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  445. machineconfig/scripts/python/{helpers → helpers_agents}/__init__.py +0 -0
  446. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_agents/agentic_frameworks/__init__.py} +0 -0
  447. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  448. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  449. machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_cloud/__init__.py} +0 -0
  450. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  451. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  452. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_croshell/__init__.py} +0 -0
  453. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  454. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  455. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  456. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  457. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/__init__.py} +0 -0
  458. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_devops/themes/__init__.py} +0 -0
  459. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  460. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  461. /machineconfig/scripts/{linux → python/helpers_network}/mount_drive +0 -0
  462. /machineconfig/scripts/python/{mount_nw_drive.py → helpers_network/mount_nw_drive.py} +0 -0
  463. /machineconfig/scripts/{linux → python/helpers_network}/mount_smb +0 -0
  464. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  465. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  466. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  467. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  468. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  469. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  470. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  471. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
  472. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
@@ -1,28 +1,27 @@
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
  from pathlib import Path
8
- from typing import TypedDict, Optional, Dict, List, Any
6
+ from typing import Optional, Any
7
+ # from rich.console import Console
9
8
  from machineconfig.utils.scheduler import Scheduler
10
9
  from machineconfig.cluster.sessions_managers.wt_local import WTLayoutGenerator
10
+ from machineconfig.cluster.sessions_managers.wt_utils.wt_helpers import check_wt_session_status
11
11
  from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
12
- from machineconfig.cluster.sessions_managers.zellij_utils.monitoring_types import (
13
- StartResult, GlobalSummary, ActiveSessionInfo, CommandStatus, CommandSummary
12
+ from machineconfig.cluster.sessions_managers.zellij_utils.monitoring_types import StartResult, ActiveSessionInfo
13
+ from machineconfig.cluster.sessions_managers.wt_utils.manager_persistence import (
14
+ generate_session_id, save_json_file, load_json_file, list_saved_sessions_in_dir, delete_session_dir, ensure_session_dir_exists
14
15
  )
16
+ from machineconfig.cluster.sessions_managers.wt_utils.status_reporting import (
17
+ print_global_summary, print_session_health_status, print_commands_status, calculate_session_summary, calculate_global_summary_from_status
18
+ )
19
+
15
20
 
16
21
 
17
- class WTSessionReport(TypedDict):
18
- session_status: Dict[str, Any] # WT-specific session status
19
- commands_status: Dict[str, CommandStatus]
20
- summary: CommandSummary
21
22
 
22
- logging.basicConfig(level=logging.INFO)
23
- logger = logging.getLogger(__name__)
23
+ TMP_SERIALIZATION_DIR = Path.home() / "tmp_results" / "wt_sessions" / "serialized"
24
24
 
25
- TMP_SERIALIZATION_DIR = Path.home().joinpath("tmp_results", "session_manager", "wt", "local_manager")
26
25
 
27
26
 
28
27
  class WTLocalManager:
@@ -39,21 +38,26 @@ class WTLocalManager:
39
38
  """
40
39
  self.session_name_prefix = session_name_prefix
41
40
  self.session_layouts = session_layouts # Store the original config
42
- self.managers: List[WTLayoutGenerator] = []
41
+ self.managers: list[WTLayoutGenerator] = []
43
42
 
44
43
  # Create a WTLayoutGenerator for each session
45
44
  for layout_config in session_layouts:
46
- manager = WTLayoutGenerator()
47
- manager.create_wt_layout(layout_config=layout_config, output_dir=None)
45
+ session_name = layout_config["layoutName"]
46
+ manager = WTLayoutGenerator(layout_config=layout_config, session_name=session_name)
47
+ manager.create_layout_file()
48
48
  self.managers.append(manager)
49
49
 
50
- logger.info(f"Initialized WTLocalManager with {len(self.managers)} sessions")
51
50
 
52
- def get_all_session_names(self) -> List[str]:
51
+ logging.basicConfig(level=logging.INFO)
52
+ logger = logging.getLogger(__name__)
53
+ # console = Console()
54
+ self.logger = logger
55
+ self.logger.info(f"Initialized WTLocalManager with {len(self.managers)} sessions")
56
+ def get_all_session_names(self) -> list[str]:
53
57
  """Get all managed session names."""
54
- return [manager.session_name for manager in self.managers if manager.session_name is not None]
58
+ return [manager.session_name for manager in self.managers]
55
59
 
56
- def start_all_sessions(self) -> Dict[str, StartResult]:
60
+ def start_all_sessions(self) -> dict[str, StartResult]:
57
61
  """Start all Windows Terminal sessions with their layouts."""
58
62
  results = {}
59
63
  for manager in self.managers:
@@ -68,23 +72,23 @@ class WTLocalManager:
68
72
  # Execute the PowerShell script to start Windows Terminal
69
73
  cmd = f'powershell -ExecutionPolicy Bypass -File "{script_path}"'
70
74
 
71
- logger.info(f"Starting session '{session_name}' with script: {script_path}")
75
+ self.logger.info(f"Starting session '{session_name}' with script: {script_path}")
72
76
  result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=30)
73
77
 
74
78
  if result.returncode == 0:
75
79
  results[session_name] = {"success": True, "message": f"Session '{session_name}' started successfully"}
76
- logger.info(f"✅ Session '{session_name}' started successfully")
80
+ self.logger.info(f"✅ Session '{session_name}' started successfully")
77
81
  else:
78
82
  results[session_name] = {"success": False, "error": result.stderr or result.stdout}
79
- logger.error(f"❌ Failed to start session '{session_name}': {result.stderr}")
83
+ self.logger.error(f"❌ Failed to start session '{session_name}': {result.stderr}")
80
84
 
81
85
  except Exception as e:
82
86
  results[session_name] = {"success": False, "error": str(e)}
83
- logger.error(f"❌ Exception starting session '{session_name}': {e}")
87
+ self.logger.error(f"❌ Exception starting session '{session_name}': {e}")
84
88
 
85
89
  return results
86
90
 
87
- def kill_all_sessions(self) -> Dict[str, StartResult]:
91
+ def kill_all_sessions(self) -> dict[str, StartResult]:
88
92
  """Kill all managed Windows Terminal sessions."""
89
93
  results = {}
90
94
  for manager in self.managers:
@@ -93,7 +97,7 @@ class WTLocalManager:
93
97
  # Kill all Windows Terminal processes (Windows Terminal doesn't have session-specific killing)
94
98
  cmd = "powershell -Command \"Get-Process -Name 'WindowsTerminal' -ErrorAction SilentlyContinue | Stop-Process -Force\""
95
99
 
96
- logger.info(f"Killing Windows Terminal processes for session '{session_name}'")
100
+ self.logger.info(f"Killing Windows Terminal processes for session '{session_name}'")
97
101
  result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=10)
98
102
 
99
103
  results[session_name] = {"success": result.returncode == 0, "message": "Windows Terminal processes killed" if result.returncode == 0 else result.stderr}
@@ -128,105 +132,30 @@ class WTLocalManager:
128
132
  commands.append("")
129
133
  return "\n".join(commands)
130
134
 
131
- def check_all_sessions_status(self) -> Dict[str, WTSessionReport]:
132
- """Check the status of all sessions and their commands."""
135
+ def check_all_sessions_status(self) -> dict[str, dict[str, Any]]:
133
136
  status_report = {}
134
-
135
137
  for manager in self.managers:
136
138
  session_name = manager.session_name or "default"
137
-
138
- # Get session status
139
- session_status = WTLayoutGenerator.check_wt_session_status(session_name)
140
-
141
- # Get commands status for this session
139
+ session_status = check_wt_session_status(session_name)
142
140
  commands_status = manager.check_all_commands_status()
143
-
144
- # Calculate summary for this session
145
- running_count = sum(1 for status in commands_status.values() if status.get("running", False))
146
- total_count = len(commands_status)
147
-
148
- status_report[session_name] = {
149
- "session_status": session_status,
150
- "commands_status": commands_status,
151
- "summary": {"total_commands": total_count, "running_commands": running_count, "stopped_commands": total_count - running_count, "session_healthy": session_status.get("session_exists", False)},
152
- }
153
-
141
+ summary = calculate_session_summary(commands_status, session_status.get("session_exists", False))
142
+ status_report[session_name] = {"session_status": session_status, "commands_status": commands_status, "summary": summary}
154
143
  return status_report
155
144
 
156
- def get_global_summary(self) -> GlobalSummary:
157
- """Get a global summary across all sessions."""
145
+ def get_global_summary(self) -> dict[str, Any]:
158
146
  all_status = self.check_all_sessions_status()
159
-
160
- total_sessions = len(all_status)
161
- healthy_sessions = sum(1 for status in all_status.values() if status["summary"]["session_healthy"])
162
- total_commands = sum(status["summary"]["total_commands"] for status in all_status.values())
163
- total_running = sum(status["summary"]["running_commands"] for status in all_status.values())
164
-
165
- return {
166
- "total_sessions": total_sessions,
167
- "healthy_sessions": healthy_sessions,
168
- "unhealthy_sessions": total_sessions - healthy_sessions,
169
- "total_commands": total_commands,
170
- "running_commands": total_running,
171
- "stopped_commands": total_commands - total_running,
172
- "all_sessions_healthy": healthy_sessions == total_sessions,
173
- "all_commands_running": total_running == total_commands,
174
- }
147
+ return calculate_global_summary_from_status(all_status, include_remote_machines=False)
175
148
 
176
149
  def print_status_report(self) -> None:
177
- """Print a comprehensive status report for all sessions."""
178
150
  all_status = self.check_all_sessions_status()
179
151
  global_summary = self.get_global_summary()
180
-
181
- print("=" * 80)
182
- print("🖥️ WINDOWS TERMINAL LOCAL MANAGER STATUS REPORT")
183
- print("=" * 80)
184
-
185
- # Global summary
186
- print("🌐 GLOBAL SUMMARY:")
187
- print(f" Total sessions: {global_summary['total_sessions']}")
188
- print(f" Healthy sessions: {global_summary['healthy_sessions']}")
189
- print(f" Total commands: {global_summary['total_commands']}")
190
- print(f" Running commands: {global_summary['running_commands']}")
191
- print(f" All healthy: {'✅' if global_summary['all_sessions_healthy'] else '❌'}")
192
- print()
193
-
194
- # Per-session details
152
+ print_global_summary(global_summary, "WINDOWS TERMINAL LOCAL MANAGER STATUS REPORT")
195
153
  for session_name, status in all_status.items():
196
- session_status = status["session_status"]
197
- commands_status = status["commands_status"]
198
- summary = status["summary"]
199
-
200
154
  print(f"🪟 SESSION: {session_name}")
201
155
  print("-" * 60)
202
-
203
- # Session health
204
- if session_status.get("wt_running", False):
205
- if session_status.get("session_exists", False):
206
- session_windows = session_status.get("session_windows", [])
207
- all_windows = session_status.get("all_windows", [])
208
- print("✅ Windows Terminal is running")
209
- print(f" Session windows: {len(session_windows)}")
210
- print(f" Total WT windows: {len(all_windows)}")
211
- else:
212
- print("⚠️ Windows Terminal is running but no session windows found")
213
- else:
214
- print(f"❌ Windows Terminal session issue: {session_status.get('error', 'Unknown error')}")
215
-
216
- # Commands in this session
217
- print(f" Commands ({summary['running_commands']}/{summary['total_commands']} running):")
218
- for tab_name, cmd_status in commands_status.items():
219
- status_icon = "✅" if cmd_status.get("running", False) else "❌"
220
- cmd_text = cmd_status.get("command", "Unknown")[:50]
221
- if len(cmd_status.get("command", "")) > 50:
222
- cmd_text += "..."
223
- print(f" {status_icon} {tab_name}: {cmd_text}")
224
-
225
- if cmd_status.get("processes"):
226
- for proc in cmd_status["processes"][:2]: # Show first 2 processes
227
- print(f" └─ PID {proc['pid']}: {proc['name']}")
156
+ print_session_health_status(status["session_status"], remote_name=None)
157
+ print_commands_status(status["commands_status"], status["summary"])
228
158
  print()
229
-
230
159
  print("=" * 80)
231
160
 
232
161
  def run_monitoring_routine(self, wait_ms: int = 30000) -> None:
@@ -283,133 +212,66 @@ class WTLocalManager:
283
212
  global_summary = self.get_global_summary()
284
213
  print(f"📊 Quick Summary: {global_summary['running_commands']}/{global_summary['total_commands']} commands running across {global_summary['healthy_sessions']}/{global_summary['total_sessions']} sessions")
285
214
 
286
- logger.info(f"Starting monitoring routine with {wait_ms}ms intervals")
287
- sched = Scheduler(routine=routine, wait_ms=wait_ms, logger=logger)
215
+ self.logger.info(f"Starting monitoring routine with {wait_ms}ms intervals")
216
+ from machineconfig.utils.scheduler import LoggerTemplate
217
+ from typing import cast
218
+ sched = Scheduler(routine=routine, wait_ms=wait_ms, logger=cast(LoggerTemplate, self.logger))
288
219
  sched.run(max_cycles=None)
289
220
 
290
221
  def save(self, session_id: Optional[str] = None) -> str:
291
- """Save the manager state to disk."""
292
222
  if session_id is None:
293
- session_id = str(uuid.uuid4())[:8]
294
-
295
- # Create session directory
223
+ session_id = generate_session_id()
296
224
  session_dir = TMP_SERIALIZATION_DIR / session_id
297
- session_dir.mkdir(parents=True, exist_ok=True)
298
-
299
- # Save the session2wt_tabs configuration
300
- config_file = session_dir / "session_layouts.json"
301
- text = json.dumps(self.session_layouts, indent=2, ensure_ascii=False)
302
- config_file.write_text(text, encoding="utf-8")
303
-
304
- # Save metadata
225
+ ensure_session_dir_exists(session_dir)
226
+ save_json_file(session_dir / "session_layouts.json", self.session_layouts, "session layouts")
305
227
  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": "WTLocalManager"}
306
- metadata_file = session_dir / "metadata.json"
307
- text = json.dumps(metadata, indent=2, ensure_ascii=False)
308
- metadata_file.write_text(text, encoding="utf-8")
309
-
310
- # Save each manager's state
228
+ save_json_file(session_dir / "metadata.json", metadata, "metadata")
311
229
  managers_dir = session_dir / "managers"
312
230
  managers_dir.mkdir(exist_ok=True)
313
-
314
231
  for i, manager in enumerate(self.managers):
315
232
  manager_data = {"session_name": manager.session_name, "layout_config": manager.layout_config, "script_path": manager.script_path}
316
- manager_file = managers_dir / f"manager_{i}_{manager.session_name}.json"
317
- text = json.dumps(manager_data, indent=2, ensure_ascii=False)
318
- manager_file.write_text(text, encoding="utf-8")
319
-
320
- logger.info(f"✅ Saved WTLocalManager session to: {session_dir}")
233
+ save_json_file(managers_dir / f"manager_{i}_{manager.session_name}.json", manager_data, f"manager {i}")
234
+ self.logger.info(f"✅ Saved WTLocalManager session to: {session_dir}")
321
235
  return session_id
322
236
 
323
- @classmethod
324
- def load(cls, session_id: str) -> "WTLocalManager":
325
- """Load a saved manager state from disk."""
237
+ @staticmethod
238
+ def load(session_id: str) -> "WTLocalManager":
326
239
  session_dir = TMP_SERIALIZATION_DIR / session_id
327
-
328
240
  if not session_dir.exists():
329
241
  raise FileNotFoundError(f"Session directory not found: {session_dir}")
330
-
331
- # Load configuration
332
- config_file = session_dir / "session_layouts.json"
333
- if not config_file.exists():
334
- raise FileNotFoundError(f"Configuration file not found: {config_file}")
335
-
336
- text = config_file.read_text(encoding="utf-8")
337
- session_layouts = json.loads(text)
338
-
339
- # Load metadata
340
- metadata_file = session_dir / "metadata.json"
341
- session_name_prefix = "LocalWTMgr" # default fallback
342
- if metadata_file.exists():
343
- text = metadata_file.read_text(encoding="utf-8")
344
- metadata = json.loads(text)
345
- session_name_prefix = metadata.get("session_name_prefix", "LocalWTMgr")
346
-
347
- # Create new instance
348
- instance = cls(session_layouts=session_layouts, session_name_prefix=session_name_prefix)
349
-
350
- # Load saved manager states
242
+ loaded_data = load_json_file(session_dir / "session_layouts.json", "Configuration file")
243
+ session_layouts = loaded_data if isinstance(loaded_data, list) else [] # type: ignore[arg-type]
244
+ metadata_data = load_json_file(session_dir / "metadata.json", "Metadata file") if (session_dir / "metadata.json").exists() else {}
245
+ metadata = metadata_data if isinstance(metadata_data, dict) else {} # type: ignore[arg-type]
246
+ session_name_prefix = metadata.get("session_name_prefix", "LocalWTMgr") # type: ignore[union-attr]
247
+ instance = WTLocalManager(session_layouts=session_layouts, session_name_prefix=session_name_prefix)
351
248
  managers_dir = session_dir / "managers"
352
249
  if managers_dir.exists():
353
250
  instance.managers = []
354
- manager_files = sorted(managers_dir.glob("manager_*.json"))
355
-
356
- for manager_file in manager_files:
251
+ for manager_file in sorted(managers_dir.glob("manager_*.json")):
357
252
  try:
358
- text = manager_file.read_text(encoding="utf-8")
359
- manager_data = json.loads(text)
360
-
361
- # Recreate the manager
362
- manager = WTLayoutGenerator()
363
- manager.session_name = manager_data["session_name"]
364
- manager.layout_config = manager_data["layout_config"]
365
- manager.script_path = manager_data["script_path"]
366
-
253
+ loaded_manager_data = load_json_file(manager_file, "Manager data")
254
+ manager_data = loaded_manager_data if isinstance(loaded_manager_data, dict) else {} # type: ignore[arg-type]
255
+ manager = WTLayoutGenerator(layout_config=manager_data["layout_config"], session_name=manager_data["session_name"]) # type: ignore[typeddict-item]
256
+ manager.script_path = manager_data["script_path"] # type: ignore[typeddict-item]
367
257
  instance.managers.append(manager)
368
-
369
258
  except Exception as e:
370
- logger.warning(f"Failed to load manager from {manager_file}: {e}")
371
-
372
- logger.info(f"✅ Loaded WTLocalManager session from: {session_dir}")
259
+ instance.logger.warning(f"Failed to load manager from {manager_file}: {e}")
260
+ instance.logger.info(f"✅ Loaded WTLocalManager session from: {session_dir}")
373
261
  return instance
374
262
 
375
263
  @staticmethod
376
- def list_saved_sessions() -> List[str]:
377
- """List all saved session IDs."""
378
- if not TMP_SERIALIZATION_DIR.exists():
379
- return []
380
-
381
- sessions = []
382
- for item in TMP_SERIALIZATION_DIR.iterdir():
383
- if item.is_dir() and (item / "metadata.json").exists():
384
- sessions.append(item.name)
385
-
386
- return sorted(sessions)
264
+ def list_saved_sessions() -> list[str]:
265
+ return list_saved_sessions_in_dir(TMP_SERIALIZATION_DIR)
387
266
 
388
267
  @staticmethod
389
268
  def delete_session(session_id: str) -> bool:
390
- """Delete a saved session."""
391
- session_dir = TMP_SERIALIZATION_DIR / session_id
392
-
393
- if not session_dir.exists():
394
- logger.warning(f"Session directory not found: {session_dir}")
395
- return False
396
-
397
- try:
398
- import shutil
399
-
400
- shutil.rmtree(session_dir)
401
- logger.info(f"✅ Deleted session: {session_id}")
402
- return True
403
- except Exception as e:
404
- logger.error(f"Failed to delete session {session_id}: {e}")
405
- return False
269
+ return delete_session_dir(TMP_SERIALIZATION_DIR / session_id, session_id)
406
270
 
407
- def list_active_sessions(self) -> List[ActiveSessionInfo]:
408
- """List currently active Windows Terminal sessions managed by this instance."""
409
- active_sessions = []
271
+ def list_active_sessions(self) -> list[ActiveSessionInfo]:
272
+ active_sessions: list[ActiveSessionInfo] = []
410
273
 
411
274
  try:
412
- # Get all running Windows Terminal processes
413
275
  result = subprocess.run(
414
276
  ["powershell", "-Command", 'Get-Process -Name "WindowsTerminal" -ErrorAction SilentlyContinue | Select-Object Id, ProcessName, StartTime, MainWindowTitle | ConvertTo-Json -Depth 2'], capture_output=True, text=True, timeout=10
415
277
  )
@@ -421,7 +283,6 @@ class WTLocalManager:
421
283
  if not isinstance(all_processes, list):
422
284
  all_processes = [all_processes]
423
285
 
424
- # Filter to only our managed sessions
425
286
  for manager in self.managers:
426
287
  session_name = manager.session_name
427
288
  session_windows = []
@@ -437,16 +298,15 @@ class WTLocalManager:
437
298
  "is_active": len(session_windows) > 0,
438
299
  "tab_count": len(manager.layout_config["layoutTabs"]) if manager.layout_config else 0,
439
300
  "tabs": [tab["tabName"] for tab in manager.layout_config["layoutTabs"]] if manager.layout_config else [],
440
- "windows": session_windows,
441
301
  }
442
302
  )
443
303
 
444
304
  except Exception as e:
445
- logger.error(f"Error listing active sessions: {e}")
305
+ self.logger.error(f"Error listing active sessions: {e}")
446
306
 
447
307
  return active_sessions
448
308
 
449
- def get_wt_overview(self) -> Dict[str, Any]:
309
+ def get_wt_overview(self) -> dict[str, Any]:
450
310
  """Get overview of all Windows Terminal windows and processes."""
451
311
  try:
452
312
  result = subprocess.run(
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python3
2
- from typing import Dict, Optional, List, Any
2
+ from typing import Optional, Any
3
3
  from pathlib import Path
4
4
  import logging
5
5
  import json
@@ -11,18 +11,18 @@ from machineconfig.cluster.sessions_managers.wt_utils.layout_generator import WT
11
11
  from machineconfig.cluster.sessions_managers.wt_utils.process_monitor import WTProcessMonitor
12
12
  from machineconfig.cluster.sessions_managers.wt_utils.session_manager import WTSessionManager
13
13
  from machineconfig.cluster.sessions_managers.wt_utils.status_reporter import WTStatusReporter
14
- from machineconfig.utils.schemas.layouts.layout_types import TabConfig
14
+ from machineconfig.utils.schemas.layouts.layout_types import TabConfig, LayoutConfig
15
15
 
16
16
  logging.basicConfig(level=logging.INFO)
17
17
  logger = logging.getLogger(__name__)
18
- TMP_LAYOUT_DIR = Path.home().joinpath("tmp_results", "wt_layouts", "layout_manager")
18
+ TMP_LAYOUT_DIR = Path.home() / "tmp_results" / "wt_layouts"
19
19
 
20
20
 
21
21
  class WTRemoteLayoutGenerator:
22
- def __init__(self, remote_name: str, session_name_prefix: str):
23
- self.remote_name = remote_name
24
- self.session_name = session_name_prefix + "_" + WTLayoutGenerator.generate_random_suffix()
25
- self.tabs: List[TabConfig] = []
22
+ def __init__(self, layout_config: LayoutConfig, remote_name: str, session_name: str):
23
+ self.remote_name: str = remote_name
24
+ self.session_name: str = session_name
25
+ self.layout_config: LayoutConfig = layout_config.copy()
26
26
  self.script_path: Optional[str] = None
27
27
 
28
28
  # Initialize modular components
@@ -32,22 +32,30 @@ class WTRemoteLayoutGenerator:
32
32
  self.session_manager = WTSessionManager(self.remote_executor, self.session_name, TMP_LAYOUT_DIR)
33
33
  self.status_reporter = WTStatusReporter(self.process_monitor, self.session_manager)
34
34
 
35
- # Tabs are stored and used as List[TabConfig]; no legacy dict compatibility
36
-
37
- def create_wt_layout(self, tabs: List[TabConfig], output_dir: Optional[str]) -> str:
38
- logger.info(f"Creating Windows Terminal layout with {len(tabs)} tabs for remote '{self.remote_name}'")
39
- self.tabs = tabs
40
- if output_dir:
41
- output_path = Path(output_dir)
42
- else:
43
- output_path = TMP_LAYOUT_DIR
44
- self.script_path = self.layout_generator.create_wt_script(self.tabs, output_path, self.session_name)
45
- return self.script_path
35
+ def create_layout_file(self) -> bool:
36
+ """Create Windows Terminal layout file and return success status."""
37
+ tab_count = len(self.layout_config["layoutTabs"])
38
+ logger.info(f"Creating Windows Terminal layout with {tab_count} tabs for remote '{self.remote_name}'")
39
+
40
+ # Extract tabs from layout_config
41
+ tabs: list[TabConfig] = self.layout_config["layoutTabs"]
42
+ script_content = self.layout_generator.create_wt_script(tabs, self.session_name, window_name=None)
43
+
44
+ # Write to file
45
+ tmp_layout_dir = Path.home() / "tmp_results" / "wt_layouts" / "remote"
46
+ tmp_layout_dir.mkdir(parents=True, exist_ok=True)
47
+ random_suffix = WTLayoutGenerator.generate_random_suffix(8)
48
+ script_file = tmp_layout_dir / f"wt_layout_{self.session_name}_{random_suffix}.ps1"
49
+ script_file.write_text(script_content, encoding="utf-8")
50
+ self.script_path = str(script_file.absolute())
51
+
52
+ logger.info(f"✅ Remote layout created: {self.script_path}")
53
+ return True
46
54
 
47
55
  # Legacy methods for backward compatibility
48
56
 
49
- def to_dict(self) -> Dict[str, Any]:
50
- return {"remote_name": self.remote_name, "session_name": self.session_name, "tabs": self.tabs, "script_path": self.script_path, "created_at": datetime.now().isoformat(), "class_name": self.__class__.__name__}
57
+ def to_dict(self) -> dict[str, Any]:
58
+ return {"remote_name": self.remote_name, "session_name": self.session_name, "layout_config": self.layout_config, "script_path": self.script_path, "created_at": datetime.now().isoformat(), "class_name": self.__class__.__name__}
51
59
 
52
60
  def to_json(self, file_path: Optional[str]) -> str:
53
61
  # Generate file path if not provided
@@ -95,29 +103,18 @@ class WTRemoteLayoutGenerator:
95
103
  logger.warning(f"Class name mismatch: expected {cls.__name__}, got {data.get('class_name')}")
96
104
 
97
105
  # Create new instance
98
- # Extract session name prefix by removing the suffix
99
- session_name = data["session_name"]
100
- if "_" in session_name:
101
- session_name_prefix = "_".join(session_name.split("_")[:-1])
102
- else:
103
- session_name_prefix = session_name
104
-
105
- instance = cls(remote_name=data["remote_name"], session_name_prefix=session_name_prefix)
106
-
107
- # Restore state
108
- instance.session_name = data["session_name"]
109
- # New schema only
110
- if "tabs" in data:
111
- instance.tabs = data["tabs"]
112
- else:
113
- instance.tabs = []
106
+ instance = cls(
107
+ layout_config=data["layout_config"],
108
+ remote_name=data["remote_name"],
109
+ session_name=data["session_name"]
110
+ )
114
111
  instance.script_path = data["script_path"]
115
112
 
116
113
  logger.info(f"✅ Loaded WTRemoteLayoutGenerator from: {file_path}")
117
114
  return instance
118
115
 
119
116
  @staticmethod
120
- def list_saved_sessions(directory_path: Optional[str]) -> List[str]:
117
+ def list_saved_sessions(directory_path: Optional[str]) -> list[str]:
121
118
  if directory_path is None:
122
119
  dir_path = Path.home() / "tmp_results" / "wt_sessions" / "serialized"
123
120
  else:
@@ -132,7 +129,7 @@ class WTRemoteLayoutGenerator:
132
129
 
133
130
  if __name__ == "__main__":
134
131
  # Example usage
135
- sample_tabs: List[TabConfig] = [
132
+ sample_tabs: list[TabConfig] = [
136
133
  {"tabName": "🤖Bot1", "startDir": "~/code/bytesense/bithence", "command": "python bot1.py --create_new_bot True"},
137
134
  {"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "python bot2.py --create_new_bot True"},
138
135
  {"tabName": "📊Monitor", "startDir": "~", "command": "Get-Process | Sort-Object CPU -Descending | Select-Object -First 10"},
@@ -144,10 +141,21 @@ if __name__ == "__main__":
144
141
  session_name = "test_remote_session"
145
142
 
146
143
  try:
144
+ # Create layout config from tabs
145
+ sample_layout: LayoutConfig = {
146
+ "layoutName": "RemoteBots",
147
+ "layoutTabs": sample_tabs
148
+ }
149
+
147
150
  # Create layout using the remote generator
148
- generator = WTRemoteLayoutGenerator(remote_name=remote_name, session_name_prefix=session_name)
149
- script_path = generator.create_wt_layout(sample_tabs, None)
150
- print(f"✅ Remote layout created successfully: {script_path}")
151
+ generator = WTRemoteLayoutGenerator(
152
+ layout_config=sample_layout,
153
+ remote_name=remote_name,
154
+ session_name=session_name
155
+ )
156
+ generator.create_layout_file()
157
+
158
+ print(f"✅ Remote layout created successfully: {generator.script_path}")
151
159
 
152
160
  # Check if Windows Terminal is available on remote
153
161
  wt_available = generator.remote_executor.check_wt_available()
@@ -170,7 +178,7 @@ if __name__ == "__main__":
170
178
  # Demonstrate loading (using the full path)
171
179
  loaded_generator = WTRemoteLayoutGenerator.from_json(saved_path)
172
180
  print(f"✅ Session loaded successfully: {loaded_generator.session_name}")
173
- print(f"📊 Loaded tabs: {[tab['tabName'] for tab in loaded_generator.tabs]}")
181
+ print(f"📊 Loaded tabs: {[tab['tabName'] for tab in loaded_generator.layout_config['layoutTabs']]}")
174
182
 
175
183
  # Show command preview
176
184
  preview = generator.layout_generator.generate_wt_command(sample_tabs)
@@ -178,7 +186,7 @@ if __name__ == "__main__":
178
186
 
179
187
  # Demonstrate status checking
180
188
  print(f"\n🔍 Checking command status on remote '{remote_name}':")
181
- generator.status_reporter.print_status_report(generator.tabs)
189
+ generator.status_reporter.print_status_report(sample_tabs)
182
190
 
183
191
  # Show Windows Terminal overview
184
192
  print("\n🖥️ Windows Terminal Overview:")