machineconfig 3.99__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 (418) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/remote/script_execution.py +1 -2
  5. machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
  6. machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +128 -330
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  13. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  14. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  17. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  18. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  19. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  20. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -172
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  23. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  24. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  25. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  26. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  31. machineconfig/jobs/{python → installer}/check_installations.py +2 -16
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/gh.py +69 -53
  34. machineconfig/jobs/installer/custom/hx.py +77 -20
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +45 -30
  36. machineconfig/jobs/installer/custom_dev/brave.py +43 -35
  37. machineconfig/jobs/installer/custom_dev/bypass_paywall.py +31 -20
  38. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  39. machineconfig/jobs/installer/custom_dev/code.py +33 -21
  40. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  41. machineconfig/jobs/installer/custom_dev/espanso.py +64 -41
  42. machineconfig/jobs/installer/custom_dev/goes.py +41 -36
  43. machineconfig/jobs/installer/custom_dev/lvim.py +49 -33
  44. machineconfig/jobs/installer/custom_dev/nerdfont.py +71 -47
  45. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +32 -26
  46. machineconfig/jobs/installer/custom_dev/redis.py +51 -33
  47. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  48. machineconfig/jobs/installer/custom_dev/wezterm.py +55 -39
  49. machineconfig/jobs/installer/custom_dev/winget.py +1 -0
  50. machineconfig/jobs/installer/installer_data.json +3406 -0
  51. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  52. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  53. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  54. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  55. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  56. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  57. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  58. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  59. machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
  60. machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
  61. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  62. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  63. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  64. machineconfig/jobs/installer/package_groups.py +255 -0
  65. machineconfig/logger.py +0 -1
  66. machineconfig/profile/backup.toml +49 -0
  67. machineconfig/profile/bash_shell_profiles.md +11 -0
  68. machineconfig/profile/create_helper.py +74 -0
  69. machineconfig/profile/create_links.py +288 -0
  70. machineconfig/profile/create_links_export.py +100 -0
  71. machineconfig/profile/create_shell_profile.py +136 -0
  72. machineconfig/profile/mapper.toml +258 -0
  73. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
  74. machineconfig/scripts/__init__.py +0 -4
  75. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  76. machineconfig/scripts/linux/wrap_mcfg +47 -0
  77. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  78. machineconfig/scripts/python/agents.py +198 -0
  79. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  80. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  81. machineconfig/scripts/python/ai/generate_files.py +307 -42
  82. machineconfig/scripts/python/ai/initai.py +3 -28
  83. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  84. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  85. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  86. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  87. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  88. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  89. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  90. machineconfig/scripts/python/cloud.py +29 -0
  91. machineconfig/scripts/python/croshell.py +117 -181
  92. machineconfig/scripts/python/define.py +31 -0
  93. machineconfig/scripts/python/devops.py +44 -124
  94. machineconfig/scripts/python/devops_navigator.py +10 -0
  95. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  96. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  97. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  98. machineconfig/scripts/python/explore.py +49 -0
  99. machineconfig/scripts/python/fire_jobs.py +106 -244
  100. machineconfig/scripts/python/ftpx.py +125 -68
  101. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  102. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  103. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  104. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  106. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
  107. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  108. machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
  109. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  110. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  111. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  112. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  113. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +11 -19
  114. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  115. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
  116. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  117. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +17 -7
  118. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  119. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  120. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  121. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  122. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  123. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  124. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  125. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  126. machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
  127. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  128. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  129. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  130. machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
  131. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  132. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  133. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  134. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  135. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -87
  136. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
  137. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -0
  138. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  139. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  140. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  141. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  142. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  143. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  144. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  145. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  146. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  147. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  148. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  149. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  150. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  151. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  152. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +6 -7
  153. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  154. machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
  155. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  156. machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
  157. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  158. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
  159. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  160. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  161. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  162. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  163. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  164. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  165. machineconfig/scripts/python/interactive.py +79 -160
  166. machineconfig/scripts/python/machineconfig.py +63 -0
  167. machineconfig/scripts/python/msearch.py +21 -0
  168. machineconfig/scripts/python/nw/__init__.py +0 -0
  169. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
  170. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
  171. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  172. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
  173. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  174. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
  175. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  176. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  177. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  178. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  179. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +6 -5
  180. machineconfig/scripts/python/sessions.py +167 -0
  181. machineconfig/scripts/python/terminal.py +127 -0
  182. machineconfig/scripts/python/utils.py +66 -0
  183. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  184. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  185. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  186. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  187. machineconfig/settings/broot/br.sh +0 -4
  188. machineconfig/settings/broot/conf.toml +1 -1
  189. machineconfig/settings/helix/config.toml +16 -0
  190. machineconfig/settings/helix/languages.toml +13 -4
  191. machineconfig/settings/helix/yazi-picker.sh +12 -0
  192. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  193. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  194. machineconfig/settings/lf/linux/lfrc +10 -12
  195. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  196. machineconfig/settings/lf/windows/lfrc +18 -38
  197. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  198. machineconfig/settings/linters/.ruff.toml +1 -1
  199. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  200. machineconfig/settings/marimo/marimo.toml +80 -0
  201. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  202. machineconfig/settings/pistol/pistol.conf +1 -1
  203. machineconfig/settings/shells/bash/init.sh +55 -31
  204. machineconfig/settings/shells/nushell/config.nu +1 -34
  205. machineconfig/settings/shells/nushell/init.nu +127 -0
  206. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  207. machineconfig/settings/shells/starship/starship.toml +16 -0
  208. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  209. machineconfig/settings/shells/wt/settings.json +32 -17
  210. machineconfig/settings/shells/zsh/init.sh +89 -0
  211. machineconfig/settings/svim/linux/init.toml +0 -4
  212. machineconfig/settings/svim/windows/init.toml +0 -3
  213. machineconfig/settings/yazi/init.lua +57 -0
  214. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  215. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  216. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  217. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  218. machineconfig/settings/yazi/yazi.toml +13 -0
  219. machineconfig/setup_linux/__init__.py +10 -0
  220. machineconfig/setup_linux/apps_desktop.sh +89 -0
  221. machineconfig/setup_linux/apps_gui.sh +64 -0
  222. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  223. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  224. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  225. machineconfig/setup_linux/uv.sh +15 -0
  226. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  227. machineconfig/setup_mac/__init__.py +16 -0
  228. machineconfig/setup_mac/apps_gui.sh +248 -0
  229. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  230. machineconfig/setup_mac/uv.sh +36 -0
  231. machineconfig/setup_windows/__init__.py +8 -0
  232. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  233. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  234. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  235. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  236. machineconfig/setup_windows/uv.ps1 +10 -0
  237. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -9
  238. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  239. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
  240. machineconfig/utils/accessories.py +7 -5
  241. machineconfig/utils/cloud/onedrive/README.md +139 -0
  242. machineconfig/utils/code.py +140 -93
  243. machineconfig/utils/files/art/fat_croco.txt +10 -0
  244. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  245. machineconfig/utils/files/art/happy_croco.txt +22 -0
  246. machineconfig/utils/files/art/water_croco.txt +11 -0
  247. machineconfig/utils/files/ascii_art.py +118 -0
  248. machineconfig/utils/files/dbms.py +257 -0
  249. machineconfig/utils/files/headers.py +68 -0
  250. machineconfig/utils/files/ouch/__init__.py +0 -0
  251. machineconfig/utils/files/ouch/decompress.py +45 -0
  252. machineconfig/utils/files/read.py +95 -0
  253. machineconfig/utils/installer_utils/github_release_bulk.py +2 -12
  254. machineconfig/utils/installer_utils/installer_class.py +68 -126
  255. machineconfig/utils/installer_utils/installer_cli.py +181 -0
  256. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +38 -85
  257. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +69 -69
  258. machineconfig/utils/io.py +77 -23
  259. machineconfig/utils/links.py +309 -100
  260. machineconfig/utils/meta.py +255 -0
  261. machineconfig/utils/notifications.py +1 -1
  262. machineconfig/utils/options.py +10 -25
  263. machineconfig/utils/path_extended.py +94 -104
  264. machineconfig/utils/path_helper.py +75 -22
  265. machineconfig/utils/procs.py +50 -74
  266. machineconfig/utils/scheduler.py +94 -97
  267. machineconfig/utils/scheduling.py +0 -3
  268. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
  269. machineconfig/utils/schemas/installer/installer_types.py +0 -1
  270. machineconfig/utils/schemas/layouts/layout_types.py +2 -1
  271. machineconfig/utils/source_of_truth.py +3 -6
  272. machineconfig/utils/ssh.py +742 -254
  273. machineconfig/utils/ssh_utils/utils.py +0 -0
  274. machineconfig/utils/terminal.py +3 -140
  275. machineconfig/utils/tst.py +20 -0
  276. machineconfig/utils/upgrade_packages.py +109 -28
  277. machineconfig/utils/ve.py +13 -5
  278. machineconfig-7.66.dist-info/METADATA +124 -0
  279. machineconfig-7.66.dist-info/RECORD +451 -0
  280. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  281. machineconfig/cluster/templates/utils.py +0 -51
  282. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  283. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  284. machineconfig/jobs/installer/packages_custom_dev.json +0 -226
  285. machineconfig/jobs/installer/packages_custom_essential.json +0 -39
  286. machineconfig/jobs/installer/packages_github_dev.json +0 -1110
  287. machineconfig/jobs/installer/packages_github_essential.json +0 -804
  288. machineconfig/jobs/linux/msc/cli_agents.sh +0 -37
  289. machineconfig/jobs/python/create_bootable_media.py +0 -16
  290. machineconfig/jobs/python/python_cargo_build_share.py +0 -59
  291. machineconfig/jobs/python/python_ve_symlink.py +0 -29
  292. machineconfig/jobs/python/tasks.py +0 -3
  293. machineconfig/jobs/python/vscode/api.py +0 -49
  294. machineconfig/jobs/python/vscode/sync_code.py +0 -58
  295. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  296. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  297. machineconfig/jobs/windows/startup_file.cmd +0 -2
  298. machineconfig/profile/create.py +0 -170
  299. machineconfig/profile/shell.py +0 -176
  300. machineconfig/scripts/cloud/init.sh +0 -119
  301. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  302. machineconfig/scripts/linux/cloud_copy +0 -2
  303. machineconfig/scripts/linux/cloud_mount +0 -2
  304. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  305. machineconfig/scripts/linux/cloud_sync +0 -2
  306. machineconfig/scripts/linux/croshell +0 -3
  307. machineconfig/scripts/linux/devops +0 -2
  308. machineconfig/scripts/linux/fire +0 -2
  309. machineconfig/scripts/linux/fire_agents +0 -2
  310. machineconfig/scripts/linux/ftpx +0 -2
  311. machineconfig/scripts/linux/fzf2g +0 -21
  312. machineconfig/scripts/linux/fzffg +0 -25
  313. machineconfig/scripts/linux/gh_models +0 -2
  314. machineconfig/scripts/linux/initai +0 -2
  315. machineconfig/scripts/linux/kill_process +0 -2
  316. machineconfig/scripts/linux/programs +0 -21
  317. machineconfig/scripts/linux/repos +0 -2
  318. machineconfig/scripts/linux/scheduler +0 -2
  319. machineconfig/scripts/linux/share_smb +0 -1
  320. machineconfig/scripts/linux/start_slidev +0 -2
  321. machineconfig/scripts/linux/start_terminals +0 -3
  322. machineconfig/scripts/linux/warp-cli.sh +0 -122
  323. machineconfig/scripts/linux/wifi_conn +0 -2
  324. machineconfig/scripts/linux/z_ls +0 -104
  325. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  326. machineconfig/scripts/python/cloud_repo_sync.py +0 -186
  327. machineconfig/scripts/python/devops_devapps_install.py +0 -159
  328. machineconfig/scripts/python/devops_update_repos.py +0 -180
  329. machineconfig/scripts/python/dotfile.py +0 -52
  330. machineconfig/scripts/python/fire_agents.py +0 -175
  331. machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
  332. machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
  333. machineconfig/scripts/python/fire_jobs_args_helper.py +0 -75
  334. machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -74
  335. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  336. machineconfig/scripts/python/gh_models.py +0 -104
  337. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -114
  338. machineconfig/scripts/python/repos.py +0 -80
  339. machineconfig/scripts/python/repos_helper_action.py +0 -335
  340. machineconfig/scripts/python/share_terminal.py +0 -104
  341. machineconfig/scripts/python/snapshot.py +0 -25
  342. machineconfig/scripts/python/start_terminals.py +0 -121
  343. machineconfig/scripts/python/t4.py +0 -17
  344. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  345. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  346. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  347. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  348. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  349. machineconfig/scripts/windows/croshell.ps1 +0 -1
  350. machineconfig/scripts/windows/devops.ps1 +0 -1
  351. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  352. machineconfig/scripts/windows/fire.ps1 +0 -1
  353. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  354. machineconfig/scripts/windows/gpt.ps1 +0 -1
  355. machineconfig/scripts/windows/grep.ps1 +0 -2
  356. machineconfig/scripts/windows/initai.ps1 +0 -1
  357. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  358. machineconfig/scripts/windows/nano.ps1 +0 -3
  359. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  360. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  361. machineconfig/scripts/windows/repos.ps1 +0 -1
  362. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  363. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  364. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  365. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  366. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  367. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  368. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  369. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  370. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  371. machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
  372. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  373. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  374. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  375. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  376. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  377. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  378. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  379. machineconfig-3.99.dist-info/METADATA +0 -167
  380. machineconfig-3.99.dist-info/RECORD +0 -409
  381. machineconfig-3.99.dist-info/entry_points.txt +0 -18
  382. machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
  383. machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
  384. machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
  385. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  386. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  387. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  388. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  389. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  390. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  391. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  392. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  393. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  394. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  395. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  396. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  397. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  398. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  399. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  400. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  401. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  402. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  403. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  404. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  405. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  406. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  407. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  408. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  409. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  410. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  411. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  412. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  413. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  414. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  415. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  416. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  417. {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  418. {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
@@ -1,19 +1,30 @@
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 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 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
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
+
20
+
21
+
12
22
 
13
23
  logging.basicConfig(level=logging.INFO)
14
24
  logger = logging.getLogger(__name__)
25
+ console = Console()
26
+ TMP_SERIALIZATION_DIR = Path.home() / "tmp_results" / "wt_sessions" / "serialized"
15
27
 
16
- TMP_SERIALIZATION_DIR = Path.home().joinpath("tmp_results", "session_manager", "wt", "local_manager")
17
28
 
18
29
 
19
30
  class WTLocalManager:
@@ -30,21 +41,22 @@ class WTLocalManager:
30
41
  """
31
42
  self.session_name_prefix = session_name_prefix
32
43
  self.session_layouts = session_layouts # Store the original config
33
- self.managers: List[WTLayoutGenerator] = []
44
+ self.managers: list[WTLayoutGenerator] = []
34
45
 
35
46
  # Create a WTLayoutGenerator for each session
36
47
  for layout_config in session_layouts:
37
- manager = WTLayoutGenerator()
38
- manager.create_wt_layout(layout_config=layout_config, output_dir=None)
48
+ session_name = layout_config["layoutName"]
49
+ manager = WTLayoutGenerator(layout_config=layout_config, session_name=session_name)
50
+ manager.create_layout_file()
39
51
  self.managers.append(manager)
40
52
 
41
53
  logger.info(f"Initialized WTLocalManager with {len(self.managers)} sessions")
42
54
 
43
- def get_all_session_names(self) -> List[str]:
55
+ def get_all_session_names(self) -> list[str]:
44
56
  """Get all managed session names."""
45
- return [manager.session_name for manager in self.managers if manager.session_name is not None]
57
+ return [manager.session_name for manager in self.managers]
46
58
 
47
- def start_all_sessions(self) -> Dict[str, Any]:
59
+ def start_all_sessions(self) -> dict[str, StartResult]:
48
60
  """Start all Windows Terminal sessions with their layouts."""
49
61
  results = {}
50
62
  for manager in self.managers:
@@ -75,7 +87,7 @@ class WTLocalManager:
75
87
 
76
88
  return results
77
89
 
78
- def kill_all_sessions(self) -> Dict[str, Any]:
90
+ def kill_all_sessions(self) -> dict[str, StartResult]:
79
91
  """Kill all managed Windows Terminal sessions."""
80
92
  results = {}
81
93
  for manager in self.managers:
@@ -119,105 +131,30 @@ class WTLocalManager:
119
131
  commands.append("")
120
132
  return "\n".join(commands)
121
133
 
122
- def check_all_sessions_status(self) -> Dict[str, Dict[str, Any]]:
123
- """Check the status of all sessions and their commands."""
134
+ def check_all_sessions_status(self) -> dict[str, dict[str, Any]]:
124
135
  status_report = {}
125
-
126
136
  for manager in self.managers:
127
137
  session_name = manager.session_name or "default"
128
-
129
- # Get session status
130
- session_status = WTLayoutGenerator.check_wt_session_status(session_name)
131
-
132
- # Get commands status for this session
138
+ session_status = check_wt_session_status(session_name)
133
139
  commands_status = manager.check_all_commands_status()
134
-
135
- # Calculate summary for this session
136
- running_count = sum(1 for status in commands_status.values() if status.get("running", False))
137
- total_count = len(commands_status)
138
-
139
- status_report[session_name] = {
140
- "session_status": session_status,
141
- "commands_status": commands_status,
142
- "summary": {"total_commands": total_count, "running_commands": running_count, "stopped_commands": total_count - running_count, "session_healthy": session_status.get("session_exists", False)},
143
- }
144
-
140
+ summary = calculate_session_summary(commands_status, session_status.get("session_exists", False))
141
+ status_report[session_name] = {"session_status": session_status, "commands_status": commands_status, "summary": summary}
145
142
  return status_report
146
143
 
147
- def get_global_summary(self) -> Dict[str, Any]:
148
- """Get a global summary across all sessions."""
144
+ def get_global_summary(self) -> dict[str, Any]:
149
145
  all_status = self.check_all_sessions_status()
150
-
151
- total_sessions = len(all_status)
152
- healthy_sessions = sum(1 for status in all_status.values() if status["summary"]["session_healthy"])
153
- total_commands = sum(status["summary"]["total_commands"] for status in all_status.values())
154
- total_running = sum(status["summary"]["running_commands"] for status in all_status.values())
155
-
156
- return {
157
- "total_sessions": total_sessions,
158
- "healthy_sessions": healthy_sessions,
159
- "unhealthy_sessions": total_sessions - healthy_sessions,
160
- "total_commands": total_commands,
161
- "running_commands": total_running,
162
- "stopped_commands": total_commands - total_running,
163
- "all_sessions_healthy": healthy_sessions == total_sessions,
164
- "all_commands_running": total_running == total_commands,
165
- }
146
+ return calculate_global_summary_from_status(all_status, include_remote_machines=False)
166
147
 
167
148
  def print_status_report(self) -> None:
168
- """Print a comprehensive status report for all sessions."""
169
149
  all_status = self.check_all_sessions_status()
170
150
  global_summary = self.get_global_summary()
171
-
172
- print("=" * 80)
173
- print("🖥️ WINDOWS TERMINAL LOCAL MANAGER STATUS REPORT")
174
- print("=" * 80)
175
-
176
- # Global summary
177
- print("🌐 GLOBAL SUMMARY:")
178
- print(f" Total sessions: {global_summary['total_sessions']}")
179
- print(f" Healthy sessions: {global_summary['healthy_sessions']}")
180
- print(f" Total commands: {global_summary['total_commands']}")
181
- print(f" Running commands: {global_summary['running_commands']}")
182
- print(f" All healthy: {'✅' if global_summary['all_sessions_healthy'] else '❌'}")
183
- print()
184
-
185
- # Per-session details
151
+ print_global_summary(global_summary, "WINDOWS TERMINAL LOCAL MANAGER STATUS REPORT")
186
152
  for session_name, status in all_status.items():
187
- session_status = status["session_status"]
188
- commands_status = status["commands_status"]
189
- summary = status["summary"]
190
-
191
153
  print(f"🪟 SESSION: {session_name}")
192
154
  print("-" * 60)
193
-
194
- # Session health
195
- if session_status.get("wt_running", False):
196
- if session_status.get("session_exists", False):
197
- session_windows = session_status.get("session_windows", [])
198
- all_windows = session_status.get("all_windows", [])
199
- print("✅ Windows Terminal is running")
200
- print(f" Session windows: {len(session_windows)}")
201
- print(f" Total WT windows: {len(all_windows)}")
202
- else:
203
- print("⚠️ Windows Terminal is running but no session windows found")
204
- else:
205
- print(f"❌ Windows Terminal session issue: {session_status.get('error', 'Unknown error')}")
206
-
207
- # Commands in this session
208
- print(f" Commands ({summary['running_commands']}/{summary['total_commands']} running):")
209
- for tab_name, cmd_status in commands_status.items():
210
- status_icon = "✅" if cmd_status.get("running", False) else "❌"
211
- cmd_text = cmd_status.get("command", "Unknown")[:50]
212
- if len(cmd_status.get("command", "")) > 50:
213
- cmd_text += "..."
214
- print(f" {status_icon} {tab_name}: {cmd_text}")
215
-
216
- if cmd_status.get("processes"):
217
- for proc in cmd_status["processes"][:2]: # Show first 2 processes
218
- print(f" └─ PID {proc['pid']}: {proc['name']}")
155
+ print_session_health_status(status["session_status"], remote_name=None)
156
+ print_commands_status(status["commands_status"], status["summary"])
219
157
  print()
220
-
221
158
  print("=" * 80)
222
159
 
223
160
  def run_monitoring_routine(self, wait_ms: int = 30000) -> None:
@@ -279,128 +216,59 @@ class WTLocalManager:
279
216
  sched.run(max_cycles=None)
280
217
 
281
218
  def save(self, session_id: Optional[str] = None) -> str:
282
- """Save the manager state to disk."""
283
219
  if session_id is None:
284
- session_id = str(uuid.uuid4())[:8]
285
-
286
- # Create session directory
220
+ session_id = generate_session_id()
287
221
  session_dir = TMP_SERIALIZATION_DIR / session_id
288
- session_dir.mkdir(parents=True, exist_ok=True)
289
-
290
- # Save the session2wt_tabs configuration
291
- config_file = session_dir / "session_layouts.json"
292
- text = json.dumps(self.session_layouts, indent=2, ensure_ascii=False)
293
- config_file.write_text(text, encoding="utf-8")
294
-
295
- # Save metadata
222
+ ensure_session_dir_exists(session_dir)
223
+ save_json_file(session_dir / "session_layouts.json", self.session_layouts, "session layouts")
296
224
  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"}
297
- metadata_file = session_dir / "metadata.json"
298
- text = json.dumps(metadata, indent=2, ensure_ascii=False)
299
- metadata_file.write_text(text, encoding="utf-8")
300
-
301
- # Save each manager's state
225
+ save_json_file(session_dir / "metadata.json", metadata, "metadata")
302
226
  managers_dir = session_dir / "managers"
303
227
  managers_dir.mkdir(exist_ok=True)
304
-
305
228
  for i, manager in enumerate(self.managers):
306
229
  manager_data = {"session_name": manager.session_name, "layout_config": manager.layout_config, "script_path": manager.script_path}
307
- manager_file = managers_dir / f"manager_{i}_{manager.session_name}.json"
308
- text = json.dumps(manager_data, indent=2, ensure_ascii=False)
309
- manager_file.write_text(text, encoding="utf-8")
310
-
230
+ save_json_file(managers_dir / f"manager_{i}_{manager.session_name}.json", manager_data, f"manager {i}")
311
231
  logger.info(f"✅ Saved WTLocalManager session to: {session_dir}")
312
232
  return session_id
313
233
 
314
234
  @classmethod
315
235
  def load(cls, session_id: str) -> "WTLocalManager":
316
- """Load a saved manager state from disk."""
317
236
  session_dir = TMP_SERIALIZATION_DIR / session_id
318
-
319
237
  if not session_dir.exists():
320
238
  raise FileNotFoundError(f"Session directory not found: {session_dir}")
321
-
322
- # Load configuration
323
- config_file = session_dir / "session_layouts.json"
324
- if not config_file.exists():
325
- raise FileNotFoundError(f"Configuration file not found: {config_file}")
326
-
327
- text = config_file.read_text(encoding="utf-8")
328
- session_layouts = json.loads(text)
329
-
330
- # Load metadata
331
- metadata_file = session_dir / "metadata.json"
332
- session_name_prefix = "LocalWTMgr" # default fallback
333
- if metadata_file.exists():
334
- text = metadata_file.read_text(encoding="utf-8")
335
- metadata = json.loads(text)
336
- session_name_prefix = metadata.get("session_name_prefix", "LocalWTMgr")
337
-
338
- # Create new instance
239
+ loaded_data = load_json_file(session_dir / "session_layouts.json", "Configuration file")
240
+ session_layouts = loaded_data if isinstance(loaded_data, list) else [] # type: ignore[arg-type]
241
+ metadata_data = load_json_file(session_dir / "metadata.json", "Metadata file") if (session_dir / "metadata.json").exists() else {}
242
+ metadata = metadata_data if isinstance(metadata_data, dict) else {} # type: ignore[arg-type]
243
+ session_name_prefix = metadata.get("session_name_prefix", "LocalWTMgr") # type: ignore[union-attr]
339
244
  instance = cls(session_layouts=session_layouts, session_name_prefix=session_name_prefix)
340
-
341
- # Load saved manager states
342
245
  managers_dir = session_dir / "managers"
343
246
  if managers_dir.exists():
344
247
  instance.managers = []
345
- manager_files = sorted(managers_dir.glob("manager_*.json"))
346
-
347
- for manager_file in manager_files:
248
+ for manager_file in sorted(managers_dir.glob("manager_*.json")):
348
249
  try:
349
- text = manager_file.read_text(encoding="utf-8")
350
- manager_data = json.loads(text)
351
-
352
- # Recreate the manager
353
- manager = WTLayoutGenerator()
354
- manager.session_name = manager_data["session_name"]
355
- manager.layout_config = manager_data["layout_config"]
356
- manager.script_path = manager_data["script_path"]
357
-
250
+ loaded_manager_data = load_json_file(manager_file, "Manager data")
251
+ manager_data = loaded_manager_data if isinstance(loaded_manager_data, dict) else {} # type: ignore[arg-type]
252
+ manager = WTLayoutGenerator(layout_config=manager_data["layout_config"], session_name=manager_data["session_name"]) # type: ignore[typeddict-item]
253
+ manager.script_path = manager_data["script_path"] # type: ignore[typeddict-item]
358
254
  instance.managers.append(manager)
359
-
360
255
  except Exception as e:
361
256
  logger.warning(f"Failed to load manager from {manager_file}: {e}")
362
-
363
257
  logger.info(f"✅ Loaded WTLocalManager session from: {session_dir}")
364
258
  return instance
365
259
 
366
260
  @staticmethod
367
- def list_saved_sessions() -> List[str]:
368
- """List all saved session IDs."""
369
- if not TMP_SERIALIZATION_DIR.exists():
370
- return []
371
-
372
- sessions = []
373
- for item in TMP_SERIALIZATION_DIR.iterdir():
374
- if item.is_dir() and (item / "metadata.json").exists():
375
- sessions.append(item.name)
376
-
377
- return sorted(sessions)
261
+ def list_saved_sessions() -> list[str]:
262
+ return list_saved_sessions_in_dir(TMP_SERIALIZATION_DIR)
378
263
 
379
264
  @staticmethod
380
265
  def delete_session(session_id: str) -> bool:
381
- """Delete a saved session."""
382
- session_dir = TMP_SERIALIZATION_DIR / session_id
383
-
384
- if not session_dir.exists():
385
- logger.warning(f"Session directory not found: {session_dir}")
386
- return False
387
-
388
- try:
389
- import shutil
390
-
391
- shutil.rmtree(session_dir)
392
- logger.info(f"✅ Deleted session: {session_id}")
393
- return True
394
- except Exception as e:
395
- logger.error(f"Failed to delete session {session_id}: {e}")
396
- return False
266
+ return delete_session_dir(TMP_SERIALIZATION_DIR / session_id, session_id)
397
267
 
398
- def list_active_sessions(self) -> List[Dict[str, Any]]:
399
- """List currently active Windows Terminal sessions managed by this instance."""
400
- active_sessions = []
268
+ def list_active_sessions(self) -> list[ActiveSessionInfo]:
269
+ active_sessions: list[ActiveSessionInfo] = []
401
270
 
402
271
  try:
403
- # Get all running Windows Terminal processes
404
272
  result = subprocess.run(
405
273
  ["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
406
274
  )
@@ -412,7 +280,6 @@ class WTLocalManager:
412
280
  if not isinstance(all_processes, list):
413
281
  all_processes = [all_processes]
414
282
 
415
- # Filter to only our managed sessions
416
283
  for manager in self.managers:
417
284
  session_name = manager.session_name
418
285
  session_windows = []
@@ -428,7 +295,6 @@ class WTLocalManager:
428
295
  "is_active": len(session_windows) > 0,
429
296
  "tab_count": len(manager.layout_config["layoutTabs"]) if manager.layout_config else 0,
430
297
  "tabs": [tab["tabName"] for tab in manager.layout_config["layoutTabs"]] if manager.layout_config else [],
431
- "windows": session_windows,
432
298
  }
433
299
  )
434
300
 
@@ -437,7 +303,7 @@ class WTLocalManager:
437
303
 
438
304
  return active_sessions
439
305
 
440
- def get_wt_overview(self) -> Dict[str, Any]:
306
+ def get_wt_overview(self) -> dict[str, Any]:
441
307
  """Get overview of all Windows Terminal windows and processes."""
442
308
  try:
443
309
  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:")