machineconfig 6.82__py3-none-any.whl → 8.51__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/remote/run_cluster.py +1 -1
  3. machineconfig/cluster/remote/run_remote.py +1 -1
  4. machineconfig/cluster/sessions_managers/utils/maker.py +29 -15
  5. machineconfig/cluster/sessions_managers/wt_local.py +17 -222
  6. machineconfig/cluster/sessions_managers/wt_local_manager.py +56 -194
  7. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  8. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  9. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  10. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  11. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  12. machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
  13. machineconfig/cluster/sessions_managers/zellij_local_manager.py +4 -2
  14. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  15. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
  16. machineconfig/jobs/installer/checks/check_installations.py +133 -0
  17. machineconfig/jobs/installer/checks/install_utils.py +132 -0
  18. machineconfig/jobs/installer/checks/report_utils.py +39 -0
  19. machineconfig/jobs/installer/checks/vt_utils.py +89 -0
  20. machineconfig/jobs/installer/installer_data.json +1500 -310
  21. machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
  22. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  23. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  24. machineconfig/jobs/installer/package_groups.py +62 -91
  25. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  26. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +2 -3
  27. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
  28. machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
  29. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +14 -9
  30. machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
  31. machineconfig/jobs/installer/python_scripts/hx.py +214 -0
  32. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
  33. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +32 -26
  34. machineconfig/jobs/installer/python_scripts/sysabc.py +145 -0
  35. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
  36. machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
  37. machineconfig/jobs/installer/python_scripts/yazi.py +139 -0
  38. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
  39. machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
  40. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  41. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  42. machineconfig/jobs/scripts_dynamic/a.py +428 -0
  43. machineconfig/logger.py +1 -2
  44. machineconfig/profile/create_helper.py +56 -18
  45. machineconfig/profile/create_links.py +79 -21
  46. machineconfig/profile/create_links_export.py +87 -36
  47. machineconfig/profile/create_shell_profile.py +92 -127
  48. machineconfig/profile/mapper_data.toml +45 -0
  49. machineconfig/profile/mapper_dotfiles.toml +249 -0
  50. machineconfig/scripts/__init__.py +0 -4
  51. machineconfig/scripts/linux/wrap_mcfg +46 -0
  52. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  53. machineconfig/scripts/python/agents.py +85 -165
  54. machineconfig/scripts/python/ai/initai.py +4 -2
  55. machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
  56. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  57. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  58. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
  59. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
  60. machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
  61. machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
  62. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  63. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  64. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  65. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +6 -6
  66. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +33 -0
  67. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  68. machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
  69. machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
  70. machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
  71. machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
  72. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  73. machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
  74. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +13 -5
  75. machineconfig/scripts/python/cloud.py +58 -11
  76. machineconfig/scripts/python/croshell.py +10 -162
  77. machineconfig/scripts/python/devops.py +73 -36
  78. machineconfig/scripts/python/devops_navigator.py +16 -6
  79. machineconfig/scripts/python/fire_jobs.py +8 -222
  80. machineconfig/scripts/python/ftpx.py +7 -200
  81. machineconfig/scripts/python/graph/cli_graph.json +8743 -0
  82. machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
  83. machineconfig/scripts/python/helpers/helper_env/env_manager_tui.py +204 -0
  84. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
  85. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  86. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  87. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  88. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  89. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  90. machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
  91. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_launch.py +38 -16
  92. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_helper_types.py +11 -14
  93. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  94. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  95. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  96. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
  97. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  98. machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
  99. machineconfig/scripts/python/helpers/helpers_agents/templates/prompt.txt +10 -0
  100. machineconfig/scripts/python/helpers/helpers_agents/templates/template.sh +34 -0
  101. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +32 -25
  102. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +29 -22
  103. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +9 -8
  104. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
  105. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +3 -3
  106. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +225 -0
  107. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
  108. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +12 -12
  109. machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
  110. machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
  111. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +98 -0
  112. machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
  113. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +67 -0
  114. machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +201 -0
  115. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
  116. machineconfig/scripts/python/helpers/helpers_devops/cli_self.py +197 -0
  117. machineconfig/scripts/python/helpers/helpers_devops/cli_share_file.py +151 -0
  118. machineconfig/scripts/python/helpers/helpers_devops/cli_share_server.py +125 -0
  119. machineconfig/scripts/python/{helpers_devops/cli_terminal.py → helpers/helpers_devops/cli_share_terminal.py} +26 -22
  120. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
  121. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +17 -23
  122. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
  123. machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +78 -71
  124. machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
  125. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
  126. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
  127. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +4 -4
  128. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers/helpers_fire_command/file_wrangler.py} +57 -20
  129. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
  130. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
  131. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +26 -16
  132. machineconfig/scripts/python/helpers/helpers_msearch/__init__.py +5 -0
  133. machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
  134. machineconfig/scripts/{linux → python/helpers/helpers_msearch/scripts_linux}/fzfg +6 -5
  135. machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
  136. machineconfig/scripts/python/helpers/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  137. machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
  138. machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
  139. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
  140. machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
  141. machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
  142. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
  143. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
  144. machineconfig/scripts/python/helpers/helpers_network/address.py +174 -0
  145. machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
  146. machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
  147. machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nfs.py +2 -2
  148. machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_ssh.py +3 -3
  149. machineconfig/scripts/python/helpers/helpers_network/ssh_add_identity.py +73 -0
  150. machineconfig/scripts/python/helpers/helpers_network/ssh_add_ssh_key.py +175 -0
  151. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_linux.py +319 -0
  152. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_windows.py +275 -0
  153. machineconfig/scripts/python/{nw → helpers/helpers_network}/wifi_conn.py +1 -53
  154. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
  155. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
  156. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -1
  157. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +159 -48
  158. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +4 -3
  159. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -12
  160. machineconfig/scripts/python/helpers/helpers_repos/repo_analyzer_1.py +160 -0
  161. machineconfig/scripts/python/{helpers_repos/count_lines.py → helpers/helpers_repos/repo_analyzer_2.py} +156 -191
  162. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
  163. machineconfig/scripts/python/helpers/helpers_search/ast_search.py +74 -0
  164. machineconfig/scripts/python/helpers/helpers_search/qr_code.py +166 -0
  165. machineconfig/scripts/python/helpers/helpers_search/repo_rag.py +325 -0
  166. machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
  167. machineconfig/scripts/python/helpers/helpers_search/symantic_search.py +25 -0
  168. machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
  169. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +186 -0
  170. machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +20 -14
  171. machineconfig/scripts/python/helpers/helpers_terminal/__init__.py +0 -0
  172. machineconfig/scripts/python/helpers/helpers_terminal/terminal_impl.py +96 -0
  173. machineconfig/scripts/python/helpers/helpers_utils/download.py +150 -0
  174. machineconfig/scripts/python/helpers/helpers_utils/pdf.py +96 -0
  175. machineconfig/scripts/python/helpers/helpers_utils/python.py +210 -0
  176. machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
  177. machineconfig/scripts/python/mcfg_entry.py +143 -0
  178. machineconfig/scripts/python/msearch.py +26 -0
  179. machineconfig/scripts/python/sessions.py +69 -135
  180. machineconfig/scripts/python/terminal.py +58 -0
  181. machineconfig/scripts/python/utils.py +115 -38
  182. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  183. machineconfig/settings/atuin/config.toml +294 -0
  184. machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
  185. machineconfig/settings/broot/conf.toml +1 -1
  186. machineconfig/settings/helix/config.toml +16 -0
  187. machineconfig/settings/helix/languages.toml +13 -4
  188. machineconfig/settings/helix/yazi-picker.sh +12 -0
  189. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  190. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  191. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  192. machineconfig/settings/lf/windows/lfrc +14 -16
  193. machineconfig/settings/linters/.ruff.toml +2 -1
  194. machineconfig/settings/marimo/marimo.toml +1 -1
  195. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  196. machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
  197. machineconfig/settings/shells/bash/init.sh +47 -12
  198. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  199. machineconfig/settings/shells/nushell/config.nu +25 -33
  200. machineconfig/settings/shells/nushell/env.nu +21 -8
  201. machineconfig/settings/shells/nushell/init.nu +138 -0
  202. machineconfig/settings/shells/pwsh/init.ps1 +111 -17
  203. machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
  204. machineconfig/settings/shells/starship/starship.toml +16 -0
  205. machineconfig/settings/shells/wezterm/wezterm.lua +6 -1
  206. machineconfig/settings/shells/wt/settings.json +27 -18
  207. machineconfig/settings/shells/zsh/init.sh +42 -23
  208. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  209. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  210. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  211. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  212. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  213. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  214. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  215. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  216. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  217. machineconfig/settings/television/cable_unix/env.toml +17 -0
  218. machineconfig/settings/television/cable_unix/files.toml +11 -0
  219. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  220. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  221. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  222. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  223. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  224. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  225. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  226. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  227. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  228. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  229. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  230. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  231. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  232. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  233. machineconfig/settings/television/cable_unix/text.toml +17 -0
  234. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  235. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  236. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  237. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  238. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  239. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  240. machineconfig/settings/television/cable_windows/env.toml +17 -0
  241. machineconfig/settings/television/cable_windows/files.toml +14 -0
  242. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  243. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  244. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  245. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  246. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  247. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  248. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  249. machineconfig/settings/television/cable_windows/text.toml +17 -0
  250. machineconfig/settings/tv/config.toml +234 -0
  251. machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
  252. machineconfig/settings/wsl/.wslconfig +5 -30
  253. machineconfig/settings/wt/__init__.py +0 -0
  254. machineconfig/settings/yazi/init.lua +61 -0
  255. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  256. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  257. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  258. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  259. machineconfig/settings/yazi/theme.toml +4 -0
  260. machineconfig/settings/yazi/yazi_linux.toml +94 -0
  261. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  262. machineconfig/settings/zellij/layouts/st.kdl +40 -9
  263. machineconfig/settings/zellij/layouts/st2.kdl +1 -1
  264. machineconfig/setup_linux/__init__.py +2 -2
  265. machineconfig/setup_linux/apps_desktop.sh +8 -27
  266. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -12
  267. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +34 -0
  268. machineconfig/setup_mac/__init__.py +1 -4
  269. machineconfig/setup_mac/apps_gui.sh +248 -0
  270. machineconfig/setup_windows/__init__.py +2 -5
  271. machineconfig/setup_windows/uv.ps1 +8 -1
  272. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -12
  273. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +31 -0
  274. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  275. machineconfig/type_hinting/sql/__init__.py +1 -0
  276. machineconfig/type_hinting/sql/base.py +216 -0
  277. machineconfig/type_hinting/sql/core_schema.py +64 -0
  278. machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
  279. machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
  280. machineconfig/type_hinting/typedict/__init__.py +1 -0
  281. machineconfig/type_hinting/typedict/ast_utils.py +130 -0
  282. machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
  283. machineconfig/type_hinting/typedict/generators.py +231 -0
  284. machineconfig/type_hinting/typedict/polars_schema.py +24 -0
  285. machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
  286. machineconfig/utils/accessories.py +31 -4
  287. machineconfig/utils/code.py +163 -51
  288. machineconfig/utils/files/ascii_art.py +11 -15
  289. machineconfig/utils/files/headers.py +6 -7
  290. machineconfig/utils/files/read.py +8 -1
  291. machineconfig/utils/installer_utils/github_release_bulk.py +95 -138
  292. machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
  293. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  294. machineconfig/utils/installer_utils/installer_class.py +53 -102
  295. machineconfig/utils/installer_utils/installer_cli.py +161 -0
  296. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  297. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +42 -91
  298. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +20 -65
  299. machineconfig/utils/io.py +94 -9
  300. machineconfig/utils/links.py +56 -38
  301. machineconfig/utils/meta.py +38 -21
  302. machineconfig/utils/options.py +81 -23
  303. machineconfig/utils/options_utils/__init__.py +0 -0
  304. machineconfig/utils/options_utils/options_tv_linux.py +211 -0
  305. machineconfig/utils/options_utils/options_tv_windows.py +88 -0
  306. machineconfig/utils/options_utils/tv_options.py +37 -0
  307. machineconfig/utils/path_extended.py +52 -102
  308. machineconfig/utils/path_helper.py +76 -23
  309. machineconfig/utils/procs.py +1 -1
  310. machineconfig/utils/scheduler.py +26 -53
  311. machineconfig/utils/scheduling.py +0 -2
  312. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  313. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  314. machineconfig/utils/source_of_truth.py +6 -1
  315. machineconfig/utils/ssh.py +216 -419
  316. machineconfig/utils/ssh_utils/abc.py +5 -0
  317. machineconfig/utils/ssh_utils/copy_from_here.py +116 -0
  318. machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
  319. machineconfig/utils/ssh_utils/utils.py +158 -0
  320. machineconfig/utils/ssh_utils/wsl.py +147 -0
  321. machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
  322. machineconfig/utils/terminal.py +1 -0
  323. machineconfig/utils/upgrade_packages.py +107 -35
  324. machineconfig/utils/ve.py +12 -4
  325. machineconfig-8.51.dist-info/METADATA +140 -0
  326. machineconfig-8.51.dist-info/RECORD +543 -0
  327. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/entry_points.txt +4 -1
  328. machineconfig/jobs/installer/check_installations.py +0 -248
  329. machineconfig/jobs/installer/custom/hx.py +0 -140
  330. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  331. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  332. machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
  333. machineconfig/jobs/installer/powershell_scripts/openssh-server_add_key.ps1 +0 -7
  334. machineconfig/jobs/installer/powershell_scripts/openssh-server_copy-ssh-id.ps1 +0 -14
  335. machineconfig/profile/backup.toml +0 -49
  336. machineconfig/profile/mapper.toml +0 -256
  337. machineconfig/scripts/linux/fzf2g +0 -21
  338. machineconfig/scripts/linux/fzfag +0 -17
  339. machineconfig/scripts/linux/fzffg +0 -25
  340. machineconfig/scripts/linux/fzfrga +0 -21
  341. machineconfig/scripts/linux/mcfgs +0 -38
  342. machineconfig/scripts/linux/other/share_smb +0 -1
  343. machineconfig/scripts/linux/other/switch_ip +0 -20
  344. machineconfig/scripts/linux/skrg +0 -4
  345. machineconfig/scripts/linux/warp-cli.sh +0 -122
  346. machineconfig/scripts/linux/z_ls +0 -104
  347. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  348. machineconfig/scripts/python/helpers_devops/cli_config.py +0 -120
  349. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -77
  350. machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
  351. machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -73
  352. machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -181
  353. machineconfig/scripts/python/helpers_devops/cli_self.py +0 -122
  354. machineconfig/scripts/python/helpers_devops/cli_share_server.py +0 -104
  355. machineconfig/scripts/python/helpers_devops/cli_utils.py +0 -221
  356. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
  357. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
  358. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  359. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  360. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  361. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  362. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  363. machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
  364. machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
  365. machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -588
  366. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
  367. machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -76
  368. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  369. machineconfig/scripts/python/mcfg.py +0 -48
  370. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  371. machineconfig/scripts/python/nw/devops_add_identity.py +0 -82
  372. machineconfig/scripts/python/nw/devops_add_ssh_key.py +0 -134
  373. machineconfig/scripts/python/nw/ssh_debug_linux.py +0 -391
  374. machineconfig/scripts/python/nw/ssh_debug_windows.py +0 -338
  375. machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
  376. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  377. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  378. machineconfig/scripts/windows/fzfrga.bat +0 -20
  379. machineconfig/scripts/windows/mcfgs.ps1 +0 -17
  380. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  381. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  382. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  383. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  384. machineconfig/settings/yazi/yazi.toml +0 -4
  385. machineconfig/setup_linux/apps.sh +0 -66
  386. machineconfig/setup_linux/others/cli_installation.sh +0 -137
  387. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  388. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  389. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  390. machineconfig/setup_mac/apps.sh +0 -73
  391. machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
  392. machineconfig/setup_windows/apps.ps1 +0 -62
  393. machineconfig/setup_windows/others/obs.ps1 +0 -4
  394. machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
  395. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  396. machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
  397. machineconfig/utils/installer_utils/installer.py +0 -225
  398. machineconfig/utils/tst.py +0 -20
  399. machineconfig-6.82.dist-info/METADATA +0 -82
  400. machineconfig-6.82.dist-info/RECORD +0 -441
  401. machineconfig/jobs/installer/{custom_dev → checks}/__init__.py +0 -0
  402. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  403. machineconfig/{scripts/python/helpers_cloud → jobs/installer/python_scripts}/__init__.py +0 -0
  404. machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  405. machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  406. machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  407. machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  408. machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  409. machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  410. machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  411. machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  412. machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
  413. machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  414. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
  415. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  416. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
  417. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  418. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  419. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  420. machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  421. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  422. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  423. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  424. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  425. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  426. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  427. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  428. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  429. machineconfig/scripts/python/{helpers_croshell → ai/utils}/__init__.py +0 -0
  430. machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
  431. machineconfig/scripts/python/{helpers_devops → graph}/__init__.py +0 -0
  432. machineconfig/scripts/python/{helpers_devops/themes → helpers}/__init__.py +0 -0
  433. machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
  434. machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
  435. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/__init__.py +0 -0
  436. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/__init__.py +0 -0
  437. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
  438. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
  439. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents/templates}/template.ps1 +0 -0
  440. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_cloud}/__init__.py +0 -0
  441. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +1 -1
  442. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
  443. /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_croshell}/__init__.py +0 -0
  444. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
  445. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
  446. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
  447. /machineconfig/scripts/python/{nw → helpers/helpers_devops}/__init__.py +0 -0
  448. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/themes}/__init__.py +0 -0
  449. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  450. /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_fire_command/__init__.py} +0 -0
  451. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
  452. /machineconfig/scripts/python/{helpers_fire_command/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.py} +0 -0
  453. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers/helpers_fire_command/fire_jobs_streamlit_helper.py} +0 -0
  454. /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
  455. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers/helpers_network/__init__.py} +0 -0
  456. /machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nw_drive.py +0 -0
  457. /machineconfig/scripts/python/{nw → helpers/helpers_network}/onetimeshare.py +0 -0
  458. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
  459. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  460. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/WHEEL +0 -0
  461. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,4 @@
1
1
  from datetime import datetime
2
- import json
3
- import uuid
4
2
  import logging
5
3
  from pathlib import Path
6
4
  from typing import Optional, Any
@@ -8,8 +6,17 @@ from rich.console import Console
8
6
  from machineconfig.utils.scheduler import Scheduler
9
7
  from machineconfig.cluster.sessions_managers.wt_local import run_command_in_wt_tab
10
8
  from machineconfig.cluster.sessions_managers.wt_remote import WTRemoteLayoutGenerator
11
- from machineconfig.cluster.sessions_managers.wt_utils.layout_generator import WTLayoutGenerator
9
+ from machineconfig.cluster.sessions_managers.wt_utils.wt_helpers import generate_random_suffix
12
10
  from machineconfig.utils.schemas.layouts.layout_types import TabConfig, LayoutConfig
11
+ from machineconfig.cluster.sessions_managers.wt_utils.manager_persistence import (
12
+ generate_session_id, save_json_file, load_json_file, list_saved_sessions_in_dir, delete_session_dir, ensure_session_dir_exists
13
+ )
14
+ from machineconfig.cluster.sessions_managers.wt_utils.status_reporting import (
15
+ print_global_summary, print_session_health_status, print_commands_status, calculate_session_summary, calculate_global_summary_from_status
16
+ )
17
+ from machineconfig.cluster.sessions_managers.wt_utils.monitoring_helpers import (
18
+ collect_status_data_from_managers, flatten_status_data, check_if_all_stopped, print_status_table, collect_session_statuses, print_session_statuses
19
+ )
13
20
 
14
21
 
15
22
  # Module-level logger to be used throughout this module
@@ -26,11 +33,8 @@ class WTSessionManager:
26
33
  for machine, tab_config in machine2wt_tabs.items():
27
34
  # Convert legacy dict[str, tuple[str,str]] to LayoutConfig
28
35
  tabs: list[TabConfig] = [{"tabName": name, "startDir": cwd, "command": cmd} for name, (cwd, cmd) in tab_config.items()]
29
- layout_config: LayoutConfig = {
30
- "layoutName": f"{session_name_prefix}_{machine}",
31
- "layoutTabs": tabs
32
- }
33
- session_name = f"{session_name_prefix}_{WTLayoutGenerator.generate_random_suffix(8)}"
36
+ layout_config: LayoutConfig = {"layoutName": f"{session_name_prefix}_{machine}", "layoutTabs": tabs}
37
+ session_name = f"{session_name_prefix}_{generate_random_suffix(8)}"
34
38
  an_m = WTRemoteLayoutGenerator(layout_config=layout_config, remote_name=machine, session_name=session_name)
35
39
  an_m.create_layout_file()
36
40
  self.managers.append(an_m)
@@ -56,103 +60,49 @@ class WTSessionManager:
56
60
  def run_monitoring_routine(self, wait_ms: int = 60000) -> None:
57
61
  def routine(scheduler: Scheduler):
58
62
  if scheduler.cycle % 2 == 0:
59
- statuses = []
60
- for _idx, an_m in enumerate(self.managers):
61
- tabs = an_m.layout_config["layoutTabs"]
62
- a_status = an_m.process_monitor.check_all_commands_status(tabs)
63
- statuses.append(a_status)
64
- keys = []
65
- for item in statuses:
66
- keys.extend(item.keys())
67
- values = []
68
- for item in statuses:
69
- values.extend(item.values())
70
- # Create list of dictionaries instead of DataFrame
71
- status_data = []
72
- for i, key in enumerate(keys):
73
- if i < len(values):
74
- status_data.append({"tabName": key, "status": values[i]})
75
-
76
- # Check if all stopped
77
- running_count = sum(1 for item in status_data if item.get("status", {}).get("running", False))
78
- if running_count == 0: # they all stopped
79
- scheduler.max_cycles = scheduler.cycle # stop the scheduler from calling this routine again
80
-
81
- # Print status
82
- for item in status_data:
83
- print(f"Tab: {item['tabName']}, Status: {item['status']}")
63
+ statuses = collect_status_data_from_managers(self.managers)
64
+ status_data = flatten_status_data(statuses)
65
+ if check_if_all_stopped(status_data):
66
+ scheduler.max_cycles = scheduler.cycle
67
+ print_status_table(status_data)
84
68
  else:
85
- statuses = []
86
- for _idx, an_m in enumerate(self.managers):
87
- a_status = an_m.session_manager.check_wt_session_status()
88
- statuses.append(a_status)
89
-
90
- # Print statuses
91
- for i, status in enumerate(statuses):
92
- print(f"Manager {i}: {status}")
93
-
94
- sched = Scheduler(routine=routine, wait_ms=wait_ms, logger=logger)
69
+ statuses = collect_session_statuses(self.managers)
70
+ print_session_statuses(statuses)
71
+ from machineconfig.utils.scheduler import LoggerTemplate
72
+ from typing import cast
73
+ sched = Scheduler(routine=routine, wait_ms=wait_ms, logger=cast(LoggerTemplate, logger))
95
74
  sched.run()
96
75
 
97
76
  def save(self, session_id: Optional[str] = None) -> str:
98
77
  if session_id is None:
99
- session_id = str(uuid.uuid4())[:8]
100
-
101
- # Create session directory
78
+ session_id = generate_session_id()
102
79
  session_dir = TMP_SERIALIZATION_DIR / session_id
103
- session_dir.mkdir(parents=True, exist_ok=True)
104
-
105
- # Save the machine2wt_tabs configuration
106
- config_file = session_dir / "machine2wt_tabs.json"
107
- text = json.dumps(self.machine2wt_tabs, indent=2, ensure_ascii=False)
108
- config_file.write_text(text, encoding="utf-8")
109
-
110
- # Save session metadata
80
+ ensure_session_dir_exists(session_dir)
81
+ save_json_file(session_dir / "machine2wt_tabs.json", self.machine2wt_tabs, "machine2wt_tabs")
111
82
  metadata = {"session_name_prefix": self.session_name_prefix, "created_at": str(datetime.now()), "num_managers": len(self.managers), "machines": list(self.machine2wt_tabs.keys()), "manager_type": "WTSessionManager"}
112
- metadata_file = session_dir / "metadata.json"
113
- text = json.dumps(metadata, indent=2, ensure_ascii=False)
114
- metadata_file.write_text(text, encoding="utf-8")
115
-
116
- # Save each WTRemoteLayoutGenerator
83
+ save_json_file(session_dir / "metadata.json", metadata, "metadata")
117
84
  managers_dir = session_dir / "managers"
118
85
  managers_dir.mkdir(exist_ok=True)
119
-
120
86
  for i, manager in enumerate(self.managers):
121
- manager_file = managers_dir / f"manager_{i}_{manager.remote_name}.json"
122
- manager.to_json(str(manager_file))
123
-
87
+ manager.to_json(str(managers_dir / f"manager_{i}_{manager.remote_name}.json"))
124
88
  logger.info(f"✅ Saved WTSessionManager session to: {session_dir}")
125
89
  return session_id
126
90
 
127
91
  @classmethod
128
92
  def load(cls, session_id: str) -> "WTSessionManager":
129
93
  session_dir = TMP_SERIALIZATION_DIR / session_id
130
-
131
94
  if not session_dir.exists():
132
95
  raise FileNotFoundError(f"Session directory not found: {session_dir}")
133
- config_file = session_dir / "machine2wt_tabs.json"
134
- if not config_file.exists():
135
- raise FileNotFoundError(f"Configuration file not found: {config_file}")
136
- text = config_file.read_text(encoding="utf-8")
137
- machine2wt_tabs = json.loads(text)
138
-
139
- # Load metadata
140
- metadata_file = session_dir / "metadata.json"
141
- session_name_prefix = "WTJobMgr" # default fallback
142
- if metadata_file.exists():
143
- text = metadata_file.read_text(encoding="utf-8")
144
- metadata = json.loads(text)
145
- session_name_prefix = metadata.get("session_name_prefix", "WTJobMgr")
146
- # Create new instance (this will create new managers)
96
+ loaded_data = load_json_file(session_dir / "machine2wt_tabs.json", "Configuration file")
97
+ machine2wt_tabs = loaded_data if isinstance(loaded_data, dict) else {} # type: ignore[arg-type]
98
+ metadata_data = load_json_file(session_dir / "metadata.json", "Metadata file") if (session_dir / "metadata.json").exists() else {}
99
+ metadata = metadata_data if isinstance(metadata_data, dict) else {} # type: ignore[arg-type]
100
+ session_name_prefix = metadata.get("session_name_prefix", "WTJobMgr") # type: ignore[union-attr]
147
101
  instance = cls(machine2wt_tabs=machine2wt_tabs, session_name_prefix=session_name_prefix)
148
- # Load saved managers to restore their states
149
102
  managers_dir = session_dir / "managers"
150
103
  if managers_dir.exists():
151
- # Clear the auto-created managers and load the saved ones
152
104
  instance.managers = []
153
- # Get all manager files and sort them
154
- manager_files = sorted(managers_dir.glob("manager_*.json"))
155
- for manager_file in manager_files:
105
+ for manager_file in sorted(managers_dir.glob("manager_*.json")):
156
106
  try:
157
107
  loaded_manager = WTRemoteLayoutGenerator.from_json(str(manager_file))
158
108
  instance.managers.append(loaded_manager)
@@ -163,33 +113,11 @@ class WTSessionManager:
163
113
 
164
114
  @staticmethod
165
115
  def list_saved_sessions() -> list[str]:
166
- if not TMP_SERIALIZATION_DIR.exists():
167
- return []
168
-
169
- sessions = []
170
- for item in TMP_SERIALIZATION_DIR.iterdir():
171
- if item.is_dir() and (item / "metadata.json").exists():
172
- sessions.append(item.name)
173
-
174
- return sorted(sessions)
116
+ return list_saved_sessions_in_dir(TMP_SERIALIZATION_DIR)
175
117
 
176
118
  @staticmethod
177
119
  def delete_session(session_id: str) -> bool:
178
- session_dir = TMP_SERIALIZATION_DIR / session_id
179
-
180
- if not session_dir.exists():
181
- logger.warning(f"Session directory not found: {session_dir}")
182
- return False
183
-
184
- try:
185
- import shutil
186
-
187
- shutil.rmtree(session_dir)
188
- logger.info(f"✅ Deleted session: {session_id}")
189
- return True
190
- except Exception as e:
191
- logger.error(f"Failed to delete session {session_id}: {e}")
192
- return False
120
+ return delete_session_dir(TMP_SERIALIZATION_DIR / session_id, session_id)
193
121
 
194
122
  def start_all_sessions(self) -> dict[str, Any]:
195
123
  """Start all Windows Terminal sessions on their respective remote machines."""
@@ -216,122 +144,38 @@ class WTSessionManager:
216
144
  return results
217
145
 
218
146
  def check_all_sessions_status(self) -> dict[str, dict[str, Any]]:
219
- """Check the status of all remote sessions and their commands."""
220
147
  status_report = {}
221
-
222
148
  for manager in self.managers:
223
149
  session_key = f"{manager.remote_name}:{manager.session_name}"
224
-
225
150
  try:
226
- # Get Windows Terminal session status
227
151
  wt_status = manager.session_manager.check_wt_session_status()
228
-
229
- # Get commands status for this session
230
152
  tabs = manager.layout_config["layoutTabs"]
231
153
  commands_status = manager.process_monitor.check_all_commands_status(tabs)
232
-
233
- # Calculate summary for this session
234
- running_count = sum(1 for status in commands_status.values() if status.get("running", False))
235
- total_count = len(commands_status)
236
-
237
- status_report[session_key] = {
238
- "remote_name": manager.remote_name,
239
- "session_name": manager.session_name,
240
- "wt_status": wt_status,
241
- "commands_status": commands_status,
242
- "summary": {"total_commands": total_count, "running_commands": running_count, "stopped_commands": total_count - running_count, "session_healthy": wt_status.get("wt_running", False)},
243
- }
244
-
154
+ summary = calculate_session_summary(commands_status, wt_status.get("wt_running", False))
155
+ status_report[session_key] = {"remote_name": manager.remote_name, "session_name": manager.session_name, "wt_status": wt_status, "commands_status": commands_status, "summary": summary}
245
156
  except Exception as e:
246
157
  status_report[session_key] = {"remote_name": manager.remote_name, "session_name": manager.session_name, "error": str(e), "summary": {"total_commands": 0, "running_commands": 0, "stopped_commands": 0, "session_healthy": False}}
247
158
  logger.error(f"Error checking status for {session_key}: {e}")
248
-
249
159
  return status_report
250
160
 
251
161
  def get_global_summary(self) -> dict[str, Any]:
252
- """Get a global summary across all remote sessions."""
253
162
  all_status = self.check_all_sessions_status()
254
-
255
- total_sessions = len(all_status)
256
- healthy_sessions = sum(1 for status in all_status.values() if status["summary"]["session_healthy"])
257
- total_commands = sum(status["summary"]["total_commands"] for status in all_status.values())
258
- total_running = sum(status["summary"]["running_commands"] for status in all_status.values())
259
-
260
- return {
261
- "total_sessions": total_sessions,
262
- "healthy_sessions": healthy_sessions,
263
- "unhealthy_sessions": total_sessions - healthy_sessions,
264
- "total_commands": total_commands,
265
- "running_commands": total_running,
266
- "stopped_commands": total_commands - total_running,
267
- "all_sessions_healthy": healthy_sessions == total_sessions,
268
- "all_commands_running": total_running == total_commands,
269
- "remote_machines": list(set(status["remote_name"] for status in all_status.values())),
270
- }
163
+ return calculate_global_summary_from_status(all_status, include_remote_machines=True)
271
164
 
272
165
  def print_status_report(self) -> None:
273
- """Print a comprehensive status report for all remote sessions."""
274
166
  all_status = self.check_all_sessions_status()
275
167
  global_summary = self.get_global_summary()
276
-
277
- print("=" * 80)
278
- print("🖥️ WINDOWS TERMINAL REMOTE MANAGER STATUS REPORT")
279
- print("=" * 80)
280
-
281
- # Global summary
282
- print("🌐 GLOBAL SUMMARY:")
283
- print(f" Total sessions: {global_summary['total_sessions']}")
284
- print(f" Healthy sessions: {global_summary['healthy_sessions']}")
285
- print(f" Total commands: {global_summary['total_commands']}")
286
- print(f" Running commands: {global_summary['running_commands']}")
287
- print(f" Remote machines: {len(global_summary['remote_machines'])}")
288
- print(f" All healthy: {'✅' if global_summary['all_sessions_healthy'] else '❌'}")
289
- print()
290
-
291
- # Per-session details
168
+ print_global_summary(global_summary, "WINDOWS TERMINAL REMOTE MANAGER STATUS REPORT")
292
169
  for _, status in all_status.items():
293
- remote_name = status["remote_name"]
294
- session_name = status["session_name"]
295
-
296
- print(f"🖥️ REMOTE: {remote_name} | SESSION: {session_name}")
170
+ print(f"🖥️ REMOTE: {status['remote_name']} | SESSION: {status['session_name']}")
297
171
  print("-" * 60)
298
-
299
172
  if "error" in status:
300
173
  print(f"❌ Error: {status['error']}")
301
174
  print()
302
175
  continue
303
-
304
- wt_status = status["wt_status"]
305
- commands_status = status["commands_status"]
306
- summary = status["summary"]
307
-
308
- # Windows Terminal session health
309
- if wt_status.get("wt_running", False):
310
- if wt_status.get("session_exists", False):
311
- session_windows = wt_status.get("session_windows", [])
312
- all_windows = wt_status.get("all_windows", [])
313
- print(f"✅ Windows Terminal is running on {remote_name}")
314
- print(f" Session windows: {len(session_windows)}")
315
- print(f" Total WT windows: {len(all_windows)}")
316
- else:
317
- print(f"⚠️ Windows Terminal is running but no session windows found on {remote_name}")
318
- else:
319
- print(f"❌ Windows Terminal issue on {remote_name}: {wt_status.get('error', 'Unknown error')}")
320
-
321
- # Commands in this session
322
- print(f" Commands ({summary['running_commands']}/{summary['total_commands']} running):")
323
- for tab_name, cmd_status in commands_status.items():
324
- status_icon = "✅" if cmd_status.get("running", False) else "❌"
325
- cmd_text = cmd_status.get("command", "Unknown")[:50]
326
- if len(cmd_status.get("command", "")) > 50:
327
- cmd_text += "..."
328
- console.print(f" {status_icon} {tab_name}: {cmd_text}")
329
-
330
- if cmd_status.get("processes"):
331
- for proc in cmd_status["processes"][:2]: # Show first 2 processes
332
- console.print(f" [dim]└─[/dim] PID {proc.get('pid', 'Unknown')}: {proc.get('name', 'Unknown')}")
176
+ print_session_health_status(status["wt_status"], remote_name=status["remote_name"])
177
+ print_commands_status(status["commands_status"], status["summary"])
333
178
  print()
334
-
335
179
  print("=" * 80)
336
180
 
337
181
  def get_remote_overview(self) -> dict[str, Any]:
@@ -0,0 +1,52 @@
1
+ import json
2
+ import uuid
3
+ import logging
4
+ import shutil
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ def generate_session_id() -> str:
12
+ return str(uuid.uuid4())[:8]
13
+
14
+
15
+ def save_json_file(file_path: Path, data: dict[str, Any] | list[Any], description: str) -> None:
16
+ text = json.dumps(data, indent=2, ensure_ascii=False)
17
+ file_path.write_text(text, encoding="utf-8")
18
+ logger.debug(f"Saved {description} to {file_path}")
19
+
20
+
21
+ def load_json_file(file_path: Path, description: str) -> dict[str, Any] | list[Any]:
22
+ if not file_path.exists():
23
+ raise FileNotFoundError(f"{description} not found: {file_path}")
24
+ text = file_path.read_text(encoding="utf-8")
25
+ return json.loads(text)
26
+
27
+
28
+ def list_saved_sessions_in_dir(serialization_dir: Path) -> list[str]:
29
+ if not serialization_dir.exists():
30
+ return []
31
+ sessions = []
32
+ for item in serialization_dir.iterdir():
33
+ if item.is_dir() and (item / "metadata.json").exists():
34
+ sessions.append(item.name)
35
+ return sorted(sessions)
36
+
37
+
38
+ def delete_session_dir(session_dir: Path, session_id: str) -> bool:
39
+ if not session_dir.exists():
40
+ logger.warning(f"Session directory not found: {session_dir}")
41
+ return False
42
+ try:
43
+ shutil.rmtree(session_dir)
44
+ logger.info(f"✅ Deleted session: {session_id}")
45
+ return True
46
+ except Exception as e:
47
+ logger.error(f"Failed to delete session {session_id}: {e}")
48
+ return False
49
+
50
+
51
+ def ensure_session_dir_exists(session_dir: Path) -> None:
52
+ session_dir.mkdir(parents=True, exist_ok=True)
@@ -0,0 +1,50 @@
1
+ from typing import Any
2
+
3
+
4
+ def collect_status_data_from_managers(managers: list[Any]) -> list[dict[str, Any]]:
5
+ statuses = []
6
+ for manager in managers:
7
+ tabs = manager.layout_config["layoutTabs"]
8
+ if hasattr(manager, "process_monitor"):
9
+ a_status = manager.process_monitor.check_all_commands_status(tabs)
10
+ else:
11
+ a_status = manager.check_all_commands_status()
12
+ statuses.append(a_status)
13
+ return statuses
14
+
15
+
16
+ def flatten_status_data(statuses: list[dict[str, dict[str, Any]]]) -> list[dict[str, Any]]:
17
+ keys = []
18
+ values = []
19
+ for item in statuses:
20
+ keys.extend(item.keys())
21
+ values.extend(item.values())
22
+
23
+ status_data = []
24
+ for i, key in enumerate(keys):
25
+ if i < len(values):
26
+ status_data.append({"tabName": key, "status": values[i]})
27
+ return status_data
28
+
29
+
30
+ def check_if_all_stopped(status_data: list[dict[str, Any]]) -> bool:
31
+ running_count = sum(1 for item in status_data if item.get("status", {}).get("running", False))
32
+ return running_count == 0
33
+
34
+
35
+ def print_status_table(status_data: list[dict[str, Any]]) -> None:
36
+ for item in status_data:
37
+ print(f"Tab: {item['tabName']}, Status: {item['status']}")
38
+
39
+
40
+ def collect_session_statuses(managers: list[Any]) -> list[dict[str, Any]]:
41
+ statuses = []
42
+ for manager in managers:
43
+ a_status = manager.session_manager.check_wt_session_status()
44
+ statuses.append(a_status)
45
+ return statuses
46
+
47
+
48
+ def print_session_statuses(statuses: list[dict[str, Any]]) -> None:
49
+ for i, status in enumerate(statuses):
50
+ print(f"Manager {i}: {status}")
@@ -0,0 +1,76 @@
1
+ from typing import Any, Optional
2
+ from rich.console import Console
3
+
4
+ console = Console()
5
+
6
+
7
+ def print_global_summary(global_summary: dict[str, Any], title: str) -> None:
8
+ print("=" * 80)
9
+ print(f"🖥️ {title}")
10
+ print("=" * 80)
11
+ print("🌐 GLOBAL SUMMARY:")
12
+ print(f" Total sessions: {global_summary['total_sessions']}")
13
+ print(f" Healthy sessions: {global_summary['healthy_sessions']}")
14
+ print(f" Total commands: {global_summary['total_commands']}")
15
+ print(f" Running commands: {global_summary['running_commands']}")
16
+ if "remote_machines" in global_summary:
17
+ print(f" Remote machines: {len(global_summary['remote_machines'])}")
18
+ print(f" All healthy: {'✅' if global_summary['all_sessions_healthy'] else '❌'}")
19
+ print()
20
+
21
+
22
+ def print_session_health_status(wt_status: dict[str, Any], remote_name: Optional[str] = None) -> None:
23
+ location_str = f" on {remote_name}" if remote_name else ""
24
+ if wt_status.get("wt_running", False):
25
+ if wt_status.get("session_exists", False):
26
+ session_windows = wt_status.get("session_windows", [])
27
+ all_windows = wt_status.get("all_windows", [])
28
+ print(f"✅ Windows Terminal is running{location_str}")
29
+ print(f" Session windows: {len(session_windows)}")
30
+ print(f" Total WT windows: {len(all_windows)}")
31
+ else:
32
+ print(f"⚠️ Windows Terminal is running but no session windows found{location_str}")
33
+ else:
34
+ print(f"❌ Windows Terminal issue{location_str}: {wt_status.get('error', 'Unknown error')}")
35
+
36
+
37
+ def print_commands_status(commands_status: dict[str, dict[str, Any]], summary: dict[str, int]) -> None:
38
+ print(f" Commands ({summary['running_commands']}/{summary['total_commands']} running):")
39
+ for tab_name, cmd_status in commands_status.items():
40
+ status_icon = "✅" if cmd_status.get("running", False) else "❌"
41
+ cmd_text = cmd_status.get("command", "Unknown")[:50]
42
+ if len(cmd_status.get("command", "")) > 50:
43
+ cmd_text += "..."
44
+ console.print(f" {status_icon} {tab_name}: {cmd_text}")
45
+ if cmd_status.get("processes"):
46
+ for proc in cmd_status["processes"][:2]:
47
+ console.print(f" [dim]└─[/dim] PID {proc.get('pid', 'Unknown')}: {proc.get('name', 'Unknown')}")
48
+
49
+
50
+ def calculate_session_summary(commands_status: dict[str, dict[str, Any]], session_healthy: bool) -> dict[str, Any]:
51
+ running_count = sum(1 for status in commands_status.values() if status.get("running", False))
52
+ total_count = len(commands_status)
53
+ return {"total_commands": total_count, "running_commands": running_count, "stopped_commands": total_count - running_count, "session_healthy": session_healthy}
54
+
55
+
56
+ def calculate_global_summary_from_status(all_status: dict[str, dict[str, Any]], include_remote_machines: bool = False) -> dict[str, Any]:
57
+ total_sessions = len(all_status)
58
+ healthy_sessions = sum(1 for status in all_status.values() if status.get("summary", {}).get("session_healthy", False))
59
+ total_commands = sum(status.get("summary", {}).get("total_commands", 0) for status in all_status.values())
60
+ total_running = sum(status.get("summary", {}).get("running_commands", 0) for status in all_status.values())
61
+
62
+ result: dict[str, Any] = {
63
+ "total_sessions": total_sessions,
64
+ "healthy_sessions": healthy_sessions,
65
+ "unhealthy_sessions": total_sessions - healthy_sessions,
66
+ "total_commands": total_commands,
67
+ "running_commands": total_running,
68
+ "stopped_commands": total_commands - total_running,
69
+ "all_sessions_healthy": healthy_sessions == total_sessions,
70
+ "all_commands_running": total_running == total_commands,
71
+ }
72
+
73
+ if include_remote_machines:
74
+ result["remote_machines"] = list(set(status.get("remote_name", "") for status in all_status.values() if "remote_name" in status))
75
+
76
+ return result