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