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.
- machineconfig/cluster/remote/cloud_manager.py +1 -1
- machineconfig/cluster/remote/run_cluster.py +1 -1
- machineconfig/cluster/remote/run_remote.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +29 -15
- machineconfig/cluster/sessions_managers/wt_local.py +17 -222
- machineconfig/cluster/sessions_managers/wt_local_manager.py +56 -194
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
- machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
- machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
- machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
- machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
- machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +4 -2
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
- machineconfig/jobs/installer/checks/check_installations.py +133 -0
- machineconfig/jobs/installer/checks/install_utils.py +132 -0
- machineconfig/jobs/installer/checks/report_utils.py +39 -0
- machineconfig/jobs/installer/checks/vt_utils.py +89 -0
- machineconfig/jobs/installer/installer_data.json +1500 -310
- machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
- machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
- machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
- machineconfig/jobs/installer/package_groups.py +62 -91
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +2 -3
- machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
- machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +14 -9
- machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
- machineconfig/jobs/installer/python_scripts/hx.py +214 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +32 -26
- machineconfig/jobs/installer/python_scripts/sysabc.py +145 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
- machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
- machineconfig/jobs/installer/python_scripts/yazi.py +139 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
- machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
- machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
- machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
- machineconfig/jobs/scripts_dynamic/a.py +428 -0
- machineconfig/logger.py +1 -2
- machineconfig/profile/create_helper.py +56 -18
- machineconfig/profile/create_links.py +79 -21
- machineconfig/profile/create_links_export.py +87 -36
- machineconfig/profile/create_shell_profile.py +92 -127
- machineconfig/profile/mapper_data.toml +45 -0
- machineconfig/profile/mapper_dotfiles.toml +249 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/wrap_mcfg +46 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +85 -165
- machineconfig/scripts/python/ai/initai.py +4 -2
- machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
- machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
- machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
- machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
- machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
- machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +6 -6
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +33 -0
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
- machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
- machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
- machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
- machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
- machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
- machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +13 -5
- machineconfig/scripts/python/cloud.py +58 -11
- machineconfig/scripts/python/croshell.py +10 -162
- machineconfig/scripts/python/devops.py +73 -36
- machineconfig/scripts/python/devops_navigator.py +16 -6
- machineconfig/scripts/python/fire_jobs.py +8 -222
- machineconfig/scripts/python/ftpx.py +7 -200
- machineconfig/scripts/python/graph/cli_graph.json +8743 -0
- machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
- machineconfig/scripts/python/helpers/helper_env/env_manager_tui.py +204 -0
- machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
- machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
- machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
- machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_launch.py +38 -16
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_helper_types.py +11 -14
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
- machineconfig/scripts/python/helpers/helpers_agents/templates/prompt.txt +10 -0
- machineconfig/scripts/python/helpers/helpers_agents/templates/template.sh +34 -0
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +32 -25
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +29 -22
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +9 -8
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +3 -3
- machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +225 -0
- machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
- machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +12 -12
- machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +98 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +67 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +201 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_self.py +197 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_share_file.py +151 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_share_server.py +125 -0
- machineconfig/scripts/python/{helpers_devops/cli_terminal.py → helpers/helpers_devops/cli_share_terminal.py} +26 -22
- machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +17 -23
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
- machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +78 -71
- machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
- machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
- machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +4 -4
- machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers/helpers_fire_command/file_wrangler.py} +57 -20
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
- machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +26 -16
- machineconfig/scripts/python/helpers/helpers_msearch/__init__.py +5 -0
- machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
- machineconfig/scripts/{linux → python/helpers/helpers_msearch/scripts_linux}/fzfg +6 -5
- machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
- machineconfig/scripts/python/helpers/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
- machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
- machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
- machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
- machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
- machineconfig/scripts/python/helpers/helpers_network/address.py +174 -0
- machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
- machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
- machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nfs.py +2 -2
- machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_ssh.py +3 -3
- machineconfig/scripts/python/helpers/helpers_network/ssh_add_identity.py +73 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_add_ssh_key.py +175 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_debug_linux.py +319 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_debug_windows.py +275 -0
- machineconfig/scripts/python/{nw → helpers/helpers_network}/wifi_conn.py +1 -53
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -1
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +159 -48
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +4 -3
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -12
- machineconfig/scripts/python/helpers/helpers_repos/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/{helpers_repos/count_lines.py → helpers/helpers_repos/repo_analyzer_2.py} +156 -191
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
- machineconfig/scripts/python/helpers/helpers_search/ast_search.py +74 -0
- machineconfig/scripts/python/helpers/helpers_search/qr_code.py +166 -0
- machineconfig/scripts/python/helpers/helpers_search/repo_rag.py +325 -0
- machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
- machineconfig/scripts/python/helpers/helpers_search/symantic_search.py +25 -0
- machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
- machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +186 -0
- machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +20 -14
- machineconfig/scripts/python/helpers/helpers_terminal/__init__.py +0 -0
- machineconfig/scripts/python/helpers/helpers_terminal/terminal_impl.py +96 -0
- machineconfig/scripts/python/helpers/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers/helpers_utils/pdf.py +96 -0
- machineconfig/scripts/python/helpers/helpers_utils/python.py +210 -0
- machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
- machineconfig/scripts/python/mcfg_entry.py +143 -0
- machineconfig/scripts/python/msearch.py +26 -0
- machineconfig/scripts/python/sessions.py +69 -135
- machineconfig/scripts/python/terminal.py +58 -0
- machineconfig/scripts/python/utils.py +115 -38
- machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
- machineconfig/settings/atuin/config.toml +294 -0
- machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
- machineconfig/settings/broot/conf.toml +1 -1
- machineconfig/settings/helix/config.toml +16 -0
- machineconfig/settings/helix/languages.toml +13 -4
- machineconfig/settings/helix/yazi-picker.sh +12 -0
- machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
- machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
- machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
- machineconfig/settings/lf/windows/lfrc +14 -16
- machineconfig/settings/linters/.ruff.toml +2 -1
- machineconfig/settings/marimo/marimo.toml +1 -1
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
- machineconfig/settings/shells/bash/init.sh +47 -12
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
- machineconfig/settings/shells/nushell/config.nu +25 -33
- machineconfig/settings/shells/nushell/env.nu +21 -8
- machineconfig/settings/shells/nushell/init.nu +138 -0
- machineconfig/settings/shells/pwsh/init.ps1 +111 -17
- machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
- machineconfig/settings/shells/starship/starship.toml +16 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +6 -1
- machineconfig/settings/shells/wt/settings.json +27 -18
- machineconfig/settings/shells/zsh/init.sh +42 -23
- machineconfig/settings/television/cable_unix/alias.toml +8 -0
- machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
- machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
- machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
- machineconfig/settings/television/cable_unix/channels.toml +19 -0
- machineconfig/settings/television/cable_unix/dirs.toml +13 -0
- machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
- machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
- machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_unix/env.toml +17 -0
- machineconfig/settings/television/cable_unix/files.toml +11 -0
- machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
- machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
- machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
- machineconfig/settings/television/cable_unix/git-log.toml +12 -0
- machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
- machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
- machineconfig/settings/television/cable_unix/guix.toml +20 -0
- machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
- machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
- machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
- machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
- machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
- machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
- machineconfig/settings/television/cable_unix/procs.toml +20 -0
- machineconfig/settings/television/cable_unix/text.toml +17 -0
- machineconfig/settings/television/cable_unix/tldr.toml +18 -0
- machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
- machineconfig/settings/television/cable_windows/alias.toml +7 -0
- machineconfig/settings/television/cable_windows/dirs.toml +13 -0
- machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
- machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_windows/env.toml +17 -0
- machineconfig/settings/television/cable_windows/files.toml +14 -0
- machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
- machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
- machineconfig/settings/television/cable_windows/git-log.toml +11 -0
- machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
- machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
- machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
- machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
- machineconfig/settings/television/cable_windows/text.toml +17 -0
- machineconfig/settings/tv/config.toml +234 -0
- machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
- machineconfig/settings/wsl/.wslconfig +5 -30
- machineconfig/settings/wt/__init__.py +0 -0
- machineconfig/settings/yazi/init.lua +61 -0
- machineconfig/settings/yazi/keymap_linux.toml +94 -0
- machineconfig/settings/yazi/keymap_windows.toml +78 -0
- machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
- machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
- machineconfig/settings/yazi/theme.toml +4 -0
- machineconfig/settings/yazi/yazi_linux.toml +94 -0
- machineconfig/settings/yazi/yazi_windows.toml +58 -0
- machineconfig/settings/zellij/layouts/st.kdl +40 -9
- machineconfig/settings/zellij/layouts/st2.kdl +1 -1
- machineconfig/setup_linux/__init__.py +2 -2
- machineconfig/setup_linux/apps_desktop.sh +8 -27
- machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -12
- machineconfig/setup_linux/web_shortcuts/live_from_github.sh +34 -0
- machineconfig/setup_mac/__init__.py +1 -4
- machineconfig/setup_mac/apps_gui.sh +248 -0
- machineconfig/setup_windows/__init__.py +2 -5
- machineconfig/setup_windows/uv.ps1 +8 -1
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -12
- machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +31 -0
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
- machineconfig/type_hinting/sql/__init__.py +1 -0
- machineconfig/type_hinting/sql/base.py +216 -0
- machineconfig/type_hinting/sql/core_schema.py +64 -0
- machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
- machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
- machineconfig/type_hinting/typedict/__init__.py +1 -0
- machineconfig/type_hinting/typedict/ast_utils.py +130 -0
- machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
- machineconfig/type_hinting/typedict/generators.py +231 -0
- machineconfig/type_hinting/typedict/polars_schema.py +24 -0
- machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
- machineconfig/utils/accessories.py +31 -4
- machineconfig/utils/code.py +163 -51
- machineconfig/utils/files/ascii_art.py +11 -15
- machineconfig/utils/files/headers.py +6 -7
- machineconfig/utils/files/read.py +8 -1
- machineconfig/utils/installer_utils/github_release_bulk.py +95 -138
- machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
- machineconfig/utils/installer_utils/install_from_url.py +183 -0
- machineconfig/utils/installer_utils/installer_class.py +53 -102
- machineconfig/utils/installer_utils/installer_cli.py +161 -0
- machineconfig/utils/installer_utils/installer_helper.py +129 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +42 -91
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +20 -65
- machineconfig/utils/io.py +94 -9
- machineconfig/utils/links.py +56 -38
- machineconfig/utils/meta.py +38 -21
- machineconfig/utils/options.py +81 -23
- machineconfig/utils/options_utils/__init__.py +0 -0
- machineconfig/utils/options_utils/options_tv_linux.py +211 -0
- machineconfig/utils/options_utils/options_tv_windows.py +88 -0
- machineconfig/utils/options_utils/tv_options.py +37 -0
- machineconfig/utils/path_extended.py +52 -102
- machineconfig/utils/path_helper.py +76 -23
- machineconfig/utils/procs.py +1 -1
- machineconfig/utils/scheduler.py +26 -53
- machineconfig/utils/scheduling.py +0 -2
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/schemas/layouts/layout_types.py +1 -1
- machineconfig/utils/source_of_truth.py +6 -1
- machineconfig/utils/ssh.py +216 -419
- machineconfig/utils/ssh_utils/abc.py +5 -0
- machineconfig/utils/ssh_utils/copy_from_here.py +116 -0
- machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
- machineconfig/utils/ssh_utils/utils.py +158 -0
- machineconfig/utils/ssh_utils/wsl.py +147 -0
- machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
- machineconfig/utils/terminal.py +1 -0
- machineconfig/utils/upgrade_packages.py +107 -35
- machineconfig/utils/ve.py +12 -4
- machineconfig-8.51.dist-info/METADATA +140 -0
- machineconfig-8.51.dist-info/RECORD +543 -0
- {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/entry_points.txt +4 -1
- machineconfig/jobs/installer/check_installations.py +0 -248
- machineconfig/jobs/installer/custom/hx.py +0 -140
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
- machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
- machineconfig/jobs/installer/powershell_scripts/openssh-server_add_key.ps1 +0 -7
- machineconfig/jobs/installer/powershell_scripts/openssh-server_copy-ssh-id.ps1 +0 -14
- machineconfig/profile/backup.toml +0 -49
- machineconfig/profile/mapper.toml +0 -256
- machineconfig/scripts/linux/fzf2g +0 -21
- machineconfig/scripts/linux/fzfag +0 -17
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/fzfrga +0 -21
- machineconfig/scripts/linux/mcfgs +0 -38
- machineconfig/scripts/linux/other/share_smb +0 -1
- machineconfig/scripts/linux/other/switch_ip +0 -20
- machineconfig/scripts/linux/skrg +0 -4
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
- machineconfig/scripts/python/helpers_devops/cli_config.py +0 -120
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -77
- machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
- machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -73
- machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -181
- machineconfig/scripts/python/helpers_devops/cli_self.py +0 -122
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +0 -104
- machineconfig/scripts/python/helpers_devops/cli_utils.py +0 -221
- machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
- machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
- machineconfig/scripts/python/helpers_fire/template.sh +0 -15
- machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
- machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
- machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -588
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
- machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -76
- machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
- machineconfig/scripts/python/mcfg.py +0 -48
- machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
- machineconfig/scripts/python/nw/devops_add_identity.py +0 -82
- machineconfig/scripts/python/nw/devops_add_ssh_key.py +0 -134
- machineconfig/scripts/python/nw/ssh_debug_linux.py +0 -391
- machineconfig/scripts/python/nw/ssh_debug_windows.py +0 -338
- machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
- machineconfig/scripts/windows/fzfb.ps1 +0 -3
- machineconfig/scripts/windows/fzfg.ps1 +0 -2
- machineconfig/scripts/windows/fzfrga.bat +0 -20
- machineconfig/scripts/windows/mcfgs.ps1 +0 -17
- machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
- machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
- machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
- machineconfig/settings/lf/windows/tst.ps1 +0 -1
- machineconfig/settings/yazi/yazi.toml +0 -4
- machineconfig/setup_linux/apps.sh +0 -66
- machineconfig/setup_linux/others/cli_installation.sh +0 -137
- machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
- machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
- machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
- machineconfig/setup_mac/apps.sh +0 -73
- machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
- machineconfig/setup_windows/apps.ps1 +0 -62
- machineconfig/setup_windows/others/obs.ps1 +0 -4
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
- machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
- machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
- machineconfig/utils/installer_utils/installer.py +0 -225
- machineconfig/utils/tst.py +0 -20
- machineconfig-6.82.dist-info/METADATA +0 -82
- machineconfig-6.82.dist-info/RECORD +0 -441
- machineconfig/jobs/installer/{custom_dev → checks}/__init__.py +0 -0
- machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
- machineconfig/{scripts/python/helpers_cloud → jobs/installer/python_scripts}/__init__.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
- machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
- machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
- machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
- machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
- machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
- machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
- machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
- machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
- machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
- machineconfig/scripts/python/{helpers_croshell → ai/utils}/__init__.py +0 -0
- machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
- machineconfig/scripts/python/{helpers_devops → graph}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_devops/themes → helpers}/__init__.py +0 -0
- machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
- machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents/templates}/template.ps1 +0 -0
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_cloud}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +1 -1
- /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
- /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_croshell}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
- /machineconfig/scripts/python/{nw → helpers/helpers_devops}/__init__.py +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/themes}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
- /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_fire_command/__init__.py} +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.py} +0 -0
- /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers/helpers_fire_command/fire_jobs_streamlit_helper.py} +0 -0
- /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
- /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers/helpers_network/__init__.py} +0 -0
- /machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nw_drive.py +0 -0
- /machineconfig/scripts/python/{nw → helpers/helpers_network}/onetimeshare.py +0 -0
- /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
- {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/WHEEL +0 -0
- {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.
|
|
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
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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 =
|
|
100
|
-
|
|
101
|
-
# Create session directory
|
|
78
|
+
session_id = generate_session_id()
|
|
102
79
|
session_dir = TMP_SERIALIZATION_DIR / session_id
|
|
103
|
-
session_dir
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
134
|
-
if
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|