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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of machineconfig might be problematic. Click here for more details.

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