machineconfig 3.99__py3-none-any.whl → 7.66__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of machineconfig might be problematic. Click here for more details.
- machineconfig/__init__.py +0 -28
- machineconfig/cluster/remote/distribute.py +0 -1
- machineconfig/cluster/remote/file_manager.py +0 -2
- machineconfig/cluster/remote/script_execution.py +1 -2
- machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
- machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
- machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
- machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
- machineconfig/cluster/sessions_managers/wt_local.py +128 -330
- machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
- machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
- 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 +22 -172
- machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
- 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 -16
- machineconfig/jobs/installer/custom/boxes.py +61 -0
- machineconfig/jobs/installer/custom/gh.py +69 -53
- machineconfig/jobs/installer/custom/hx.py +77 -20
- machineconfig/jobs/installer/custom_dev/alacritty.py +45 -30
- machineconfig/jobs/installer/custom_dev/brave.py +43 -35
- machineconfig/jobs/installer/custom_dev/bypass_paywall.py +31 -20
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +33 -21
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
- machineconfig/jobs/installer/custom_dev/espanso.py +64 -41
- machineconfig/jobs/installer/custom_dev/goes.py +41 -36
- machineconfig/jobs/installer/custom_dev/lvim.py +49 -33
- machineconfig/jobs/installer/custom_dev/nerdfont.py +71 -47
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +32 -26
- machineconfig/jobs/installer/custom_dev/redis.py +51 -33
- machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +55 -39
- machineconfig/jobs/installer/custom_dev/winget.py +1 -0
- machineconfig/jobs/installer/installer_data.json +3406 -0
- 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/ngrok.sh +6 -0
- machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
- 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 +255 -0
- machineconfig/logger.py +0 -1
- machineconfig/profile/backup.toml +49 -0
- machineconfig/profile/bash_shell_profiles.md +11 -0
- machineconfig/profile/create_helper.py +74 -0
- machineconfig/profile/create_links.py +288 -0
- machineconfig/profile/create_links_export.py +100 -0
- machineconfig/profile/create_shell_profile.py +136 -0
- machineconfig/profile/mapper.toml +258 -0
- machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
- machineconfig/scripts/linux/wrap_mcfg +47 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +198 -0
- machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
- machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
- machineconfig/scripts/python/ai/generate_files.py +307 -42
- machineconfig/scripts/python/ai/initai.py +3 -28
- 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/instructions/python/dev.instructions.md +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/generic.py +27 -4
- machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
- machineconfig/scripts/python/cloud.py +29 -0
- machineconfig/scripts/python/croshell.py +117 -181
- machineconfig/scripts/python/define.py +31 -0
- machineconfig/scripts/python/devops.py +44 -124
- machineconfig/scripts/python/devops_navigator.py +10 -0
- machineconfig/scripts/python/env_manager/__init__.py +1 -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/explore.py +49 -0
- machineconfig/scripts/python/fire_jobs.py +106 -244
- machineconfig/scripts/python/ftpx.py +125 -68
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
- machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -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} +11 -19
- machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
- machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +17 -7
- machineconfig/scripts/python/helpers_devops/cli_config.py +95 -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 +134 -0
- machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
- machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
- machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
- 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 +511 -0
- machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
- 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} +2 -2
- machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
- machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -87
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -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}/fzfag +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
- 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 +588 -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_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} +6 -7
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
- machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
- machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
- machineconfig/scripts/python/helpers_repos/grource.py +340 -0
- machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
- 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 +58 -0
- machineconfig/scripts/python/helpers_utils/download.py +152 -0
- machineconfig/scripts/python/helpers_utils/path.py +108 -0
- machineconfig/scripts/python/interactive.py +79 -160
- machineconfig/scripts/python/machineconfig.py +63 -0
- machineconfig/scripts/python/msearch.py +21 -0
- machineconfig/scripts/python/nw/__init__.py +0 -0
- machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
- machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
- machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
- machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
- machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
- machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
- machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
- machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
- machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
- machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +6 -5
- machineconfig/scripts/python/sessions.py +167 -0
- machineconfig/scripts/python/terminal.py +127 -0
- machineconfig/scripts/python/utils.py +66 -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 +60 -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/fzf_edit.ps1 +2 -2
- 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 +55 -31
- machineconfig/settings/shells/nushell/config.nu +1 -34
- machineconfig/settings/shells/nushell/init.nu +127 -0
- machineconfig/settings/shells/pwsh/init.ps1 +60 -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/yazi/init.lua +57 -0
- machineconfig/settings/yazi/keymap_linux.toml +79 -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/yazi.toml +13 -0
- machineconfig/setup_linux/__init__.py +10 -0
- machineconfig/setup_linux/apps_desktop.sh +89 -0
- machineconfig/setup_linux/apps_gui.sh +64 -0
- machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
- 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_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 +8 -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 +10 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -9
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
- machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
- machineconfig/utils/accessories.py +7 -5
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +140 -93
- 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 +118 -0
- machineconfig/utils/files/dbms.py +257 -0
- machineconfig/utils/files/headers.py +68 -0
- machineconfig/utils/files/ouch/__init__.py +0 -0
- machineconfig/utils/files/ouch/decompress.py +45 -0
- machineconfig/utils/files/read.py +95 -0
- machineconfig/utils/installer_utils/github_release_bulk.py +2 -12
- machineconfig/utils/installer_utils/installer_class.py +68 -126
- machineconfig/utils/installer_utils/installer_cli.py +181 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +38 -85
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +69 -69
- machineconfig/utils/io.py +77 -23
- machineconfig/utils/links.py +309 -100
- machineconfig/utils/meta.py +255 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +10 -25
- machineconfig/utils/path_extended.py +94 -104
- machineconfig/utils/path_helper.py +75 -22
- machineconfig/utils/procs.py +50 -74
- machineconfig/utils/scheduler.py +94 -97
- machineconfig/utils/scheduling.py +0 -3
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
- machineconfig/utils/schemas/installer/installer_types.py +0 -1
- machineconfig/utils/schemas/layouts/layout_types.py +2 -1
- machineconfig/utils/source_of_truth.py +3 -6
- machineconfig/utils/ssh.py +742 -254
- machineconfig/utils/ssh_utils/utils.py +0 -0
- machineconfig/utils/terminal.py +3 -140
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +109 -28
- machineconfig/utils/ve.py +13 -5
- machineconfig-7.66.dist-info/METADATA +124 -0
- machineconfig-7.66.dist-info/RECORD +451 -0
- machineconfig-7.66.dist-info/entry_points.txt +15 -0
- machineconfig/cluster/templates/utils.py +0 -51
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
- machineconfig/jobs/installer/packages_custom_dev.json +0 -226
- machineconfig/jobs/installer/packages_custom_essential.json +0 -39
- machineconfig/jobs/installer/packages_github_dev.json +0 -1110
- machineconfig/jobs/installer/packages_github_essential.json +0 -804
- machineconfig/jobs/linux/msc/cli_agents.sh +0 -37
- machineconfig/jobs/python/create_bootable_media.py +0 -16
- machineconfig/jobs/python/python_cargo_build_share.py +0 -59
- machineconfig/jobs/python/python_ve_symlink.py +0 -29
- machineconfig/jobs/python/tasks.py +0 -3
- machineconfig/jobs/python/vscode/api.py +0 -49
- machineconfig/jobs/python/vscode/sync_code.py +0 -58
- 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 -170
- machineconfig/profile/shell.py +0 -176
- machineconfig/scripts/cloud/init.sh +0 -119
- 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/fire_agents +0 -2
- machineconfig/scripts/linux/ftpx +0 -2
- machineconfig/scripts/linux/fzf2g +0 -21
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/gh_models +0 -2
- machineconfig/scripts/linux/initai +0 -2
- machineconfig/scripts/linux/kill_process +0 -2
- machineconfig/scripts/linux/programs +0 -21
- machineconfig/scripts/linux/repos +0 -2
- machineconfig/scripts/linux/scheduler +0 -2
- machineconfig/scripts/linux/share_smb +0 -1
- 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/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
- machineconfig/scripts/python/cloud_repo_sync.py +0 -186
- machineconfig/scripts/python/devops_devapps_install.py +0 -159
- machineconfig/scripts/python/devops_update_repos.py +0 -180
- machineconfig/scripts/python/dotfile.py +0 -52
- machineconfig/scripts/python/fire_agents.py +0 -175
- machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
- machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
- machineconfig/scripts/python/fire_jobs_args_helper.py +0 -75
- machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -74
- 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 -114
- machineconfig/scripts/python/repos.py +0 -80
- machineconfig/scripts/python/repos_helper_action.py +0 -335
- machineconfig/scripts/python/share_terminal.py +0 -104
- 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/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/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/repos.ps1 +0 -1
- machineconfig/scripts/windows/scheduler.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/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
- machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
- 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-3.99.dist-info/METADATA +0 -167
- machineconfig-3.99.dist-info/RECORD +0 -409
- machineconfig-3.99.dist-info/entry_points.txt +0 -18
- machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
- machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
- machineconfig/cluster/{templates → remote}/run_remote.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/helpers_agents}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers → 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/{jobs/windows/msc/cli_agents.bat → 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/{jobs/windows/msc/cli_agents.ps1 → scripts/python/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/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
- /machineconfig/scripts/{windows/share_nfs.ps1 → 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_msearch/scripts_linux}/skrg +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
- /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
- /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
- /machineconfig/scripts/{linux → python/nw}/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-3.99.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
- {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
|
@@ -1,31 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
import
|
|
3
|
-
import subprocess
|
|
4
|
-
from machineconfig.cluster.sessions_managers.zellij_utils.monitoring_types import CommandStatus, ZellijSessionStatus, ComprehensiveStatus, ProcessInfo
|
|
5
|
-
import psutil
|
|
6
|
-
import random
|
|
7
|
-
import string
|
|
8
|
-
from typing import List, Optional
|
|
2
|
+
from typing import Optional
|
|
9
3
|
from pathlib import Path
|
|
10
4
|
import logging
|
|
11
5
|
|
|
12
6
|
from rich.console import Console
|
|
13
7
|
|
|
14
|
-
from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
|
|
8
|
+
from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
|
|
9
|
+
from machineconfig.cluster.sessions_managers.zellij_utils.monitoring_types import ComprehensiveStatus, CommandStatus
|
|
10
|
+
from machineconfig.cluster.sessions_managers.zellij_utils.zellij_local_helper import validate_layout_config, create_tab_section, check_command_status, check_zellij_session_status
|
|
11
|
+
from machineconfig.cluster.sessions_managers.zellij_utils.zellij_local_helper_restart import restart_tab_process
|
|
15
12
|
|
|
16
13
|
|
|
17
14
|
logging.basicConfig(level=logging.INFO)
|
|
18
15
|
logger = logging.getLogger(__name__)
|
|
19
16
|
console = Console()
|
|
20
|
-
TMP_LAYOUT_DIR = Path.home().joinpath("tmp_results", "session_manager", "zellij", "layout_manager")
|
|
21
17
|
|
|
22
18
|
|
|
23
|
-
|
|
24
|
-
def __init__(self):
|
|
25
|
-
self.session_name: Optional[str] = None
|
|
26
|
-
self.layout_config: Optional[LayoutConfig] = None # Store the complete layout config
|
|
27
|
-
self.layout_path: Optional[str] = None # Store the full path to the layout file
|
|
28
|
-
self.layout_template = """layout {
|
|
19
|
+
DEFAULT_LAYOUT_TEMPLATE = """layout {
|
|
29
20
|
default_tab_template {
|
|
30
21
|
// the default zellij tab-bar and status bar plugins
|
|
31
22
|
pane size=1 borderless=true {
|
|
@@ -35,303 +26,47 @@ class ZellijLayoutGenerator:
|
|
|
35
26
|
}
|
|
36
27
|
"""
|
|
37
28
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if args_str:
|
|
80
|
-
tab_section += f" args {args_str}\n"
|
|
81
|
-
tab_section += " }\n }\n"
|
|
82
|
-
return tab_section
|
|
83
|
-
|
|
84
|
-
@staticmethod
|
|
85
|
-
def _validate_layout_config(layout_config: LayoutConfig) -> None:
|
|
86
|
-
if not layout_config["layoutTabs"]:
|
|
87
|
-
raise ValueError("Layout must contain at least one tab")
|
|
88
|
-
for tab in layout_config["layoutTabs"]:
|
|
89
|
-
if not tab["tabName"].strip():
|
|
90
|
-
raise ValueError(f"Invalid tab name: {tab['tabName']}")
|
|
91
|
-
if not tab["command"].strip():
|
|
92
|
-
raise ValueError(f"Invalid command for tab '{tab['tabName']}': {tab['command']}")
|
|
93
|
-
if not tab["startDir"].strip():
|
|
94
|
-
raise ValueError(f"Invalid startDir for tab '{tab['tabName']}': {tab['startDir']}")
|
|
95
|
-
|
|
96
|
-
def create_zellij_layout(self, layout_config: LayoutConfig, output_dir: Optional[str], session_name: Optional[str]) -> str:
|
|
97
|
-
ZellijLayoutGenerator._validate_layout_config(layout_config)
|
|
98
|
-
|
|
99
|
-
# Enhanced Rich logging
|
|
100
|
-
tab_count = len(layout_config["layoutTabs"])
|
|
101
|
-
layout_name = layout_config["layoutName"]
|
|
102
|
-
console.print(f"[bold cyan]📋 Creating Zellij layout[/bold cyan] [bright_green]'{layout_name}' with {tab_count} tabs[/bright_green]")
|
|
103
|
-
|
|
104
|
-
# Display tab summary with emojis and colors
|
|
105
|
-
for tab in layout_config["layoutTabs"]:
|
|
106
|
-
console.print(f" [yellow]→[/yellow] [bold]{tab['tabName']}[/bold] [dim]in[/dim] [blue]{tab['startDir']}[/blue]")
|
|
107
|
-
|
|
108
|
-
# Store session name and layout config for status checking
|
|
109
|
-
self.session_name = session_name or layout_name
|
|
110
|
-
self.layout_config = layout_config.copy()
|
|
111
|
-
|
|
112
|
-
layout_content = self.layout_template
|
|
113
|
-
for tab in layout_config["layoutTabs"]:
|
|
114
|
-
layout_content += "\n" + ZellijLayoutGenerator._create_tab_section(tab)
|
|
115
|
-
layout_content += "\n}\n"
|
|
116
|
-
|
|
117
|
-
try:
|
|
118
|
-
random_suffix = ZellijLayoutGenerator._generate_random_suffix(8)
|
|
119
|
-
if output_dir:
|
|
120
|
-
output_path = Path(output_dir)
|
|
121
|
-
output_path.mkdir(parents=True, exist_ok=True)
|
|
122
|
-
layout_file = output_path / f"zellij_layout_{random_suffix}.kdl"
|
|
123
|
-
layout_file.write_text(layout_content, encoding="utf-8")
|
|
124
|
-
self.layout_path = str(layout_file.absolute())
|
|
125
|
-
else:
|
|
126
|
-
# Use the predefined TMP_LAYOUT_DIR for temporary files
|
|
127
|
-
TMP_LAYOUT_DIR.mkdir(parents=True, exist_ok=True)
|
|
128
|
-
layout_file = TMP_LAYOUT_DIR / f"zellij_layout_{self.session_name or 'default'}_{random_suffix}.kdl"
|
|
129
|
-
layout_file.write_text(layout_content, encoding="utf-8")
|
|
130
|
-
self.layout_path = str(layout_file.absolute())
|
|
131
|
-
|
|
132
|
-
# Enhanced Rich logging for file creation
|
|
133
|
-
console.print(f"[bold green]✅ Zellij layout file created:[/bold green] [cyan]{self.layout_path}[/cyan]")
|
|
134
|
-
return self.layout_path
|
|
135
|
-
except OSError as e:
|
|
136
|
-
logger.error(f"Failed to create layout file: {e}")
|
|
137
|
-
raise
|
|
138
|
-
|
|
139
|
-
@staticmethod
|
|
140
|
-
def get_layout_preview(layout_config: LayoutConfig, layout_template: str | None) -> str:
|
|
141
|
-
if layout_template is None:
|
|
142
|
-
layout_template = """layout {
|
|
143
|
-
default_tab_template {
|
|
144
|
-
// the default zellij tab-bar and status bar plugins
|
|
145
|
-
pane size=1 borderless=true {
|
|
146
|
-
plugin location="zellij:compact-bar"
|
|
147
|
-
}
|
|
148
|
-
children
|
|
149
|
-
}
|
|
150
|
-
"""
|
|
151
|
-
ZellijLayoutGenerator._validate_layout_config(layout_config)
|
|
152
|
-
layout_content = layout_template
|
|
153
|
-
for tab in layout_config["layoutTabs"]:
|
|
154
|
-
layout_content += "\n" + ZellijLayoutGenerator._create_tab_section(tab)
|
|
155
|
-
return layout_content + "\n}\n"
|
|
156
|
-
|
|
157
|
-
@staticmethod
|
|
158
|
-
def check_command_status(tab_name: str, layout_config: LayoutConfig) -> CommandStatus:
|
|
159
|
-
# Find the tab with the given name
|
|
160
|
-
tab_config = None
|
|
161
|
-
for tab in layout_config["layoutTabs"]:
|
|
162
|
-
if tab["tabName"] == tab_name:
|
|
163
|
-
tab_config = tab
|
|
164
|
-
break
|
|
165
|
-
|
|
166
|
-
if tab_config is None:
|
|
167
|
-
return {"status": "unknown", "error": f"Tab '{tab_name}' not found in layout config", "running": False, "command": "", "cwd": "", "tab_name": tab_name, "processes": []}
|
|
168
|
-
|
|
169
|
-
command = tab_config["command"]
|
|
170
|
-
cwd = tab_config["startDir"]
|
|
171
|
-
cmd, args = ZellijLayoutGenerator._parse_command(command)
|
|
172
|
-
try:
|
|
173
|
-
shells = {"bash", "sh", "zsh", "fish"}
|
|
174
|
-
matching_processes: list[ProcessInfo] = []
|
|
175
|
-
for proc in psutil.process_iter(["pid", "name", "cmdline", "status", "ppid", "create_time", "memory_info"]):
|
|
176
|
-
try:
|
|
177
|
-
info = proc.info
|
|
178
|
-
proc_cmdline: list[str] | None = info.get("cmdline") # type: ignore[assignment]
|
|
179
|
-
if not proc_cmdline:
|
|
180
|
-
continue
|
|
181
|
-
if info.get("status") in ["zombie", "dead", "stopped"]:
|
|
182
|
-
continue
|
|
183
|
-
proc_name = info.get("name", "")
|
|
184
|
-
is_match = False
|
|
185
|
-
joined_cmdline = " ".join(proc_cmdline)
|
|
186
|
-
# Primary matching heuristics - more precise matching
|
|
187
|
-
if proc_name == cmd and cmd not in shells:
|
|
188
|
-
# For non-shell commands, match if args appear in cmdline
|
|
189
|
-
if not args or any(arg in joined_cmdline for arg in args):
|
|
190
|
-
is_match = True
|
|
191
|
-
elif proc_name == cmd and cmd in shells:
|
|
192
|
-
# For shell commands, require more precise matching to avoid false positives
|
|
193
|
-
if args:
|
|
194
|
-
# Check if all args appear as separate cmdline arguments (not just substrings)
|
|
195
|
-
args_found = 0
|
|
196
|
-
for arg in args:
|
|
197
|
-
for cmdline_arg in proc_cmdline[1:]: # Skip shell name
|
|
198
|
-
if arg == cmdline_arg or (len(arg) > 3 and arg in cmdline_arg):
|
|
199
|
-
args_found += 1
|
|
200
|
-
break
|
|
201
|
-
# Require at least as many args found as we're looking for
|
|
202
|
-
if args_found >= len(args):
|
|
203
|
-
is_match = True
|
|
204
|
-
elif cmd in proc_cmdline[0] and cmd not in shells:
|
|
205
|
-
# Non-shell command in first argument
|
|
206
|
-
is_match = True
|
|
207
|
-
|
|
208
|
-
# Additional shell wrapper filter - be more restrictive for shells
|
|
209
|
-
if is_match and proc_name in shells and args:
|
|
210
|
-
# For shell processes, ensure the match is actually meaningful
|
|
211
|
-
# Don't match generic shell sessions just because they contain common paths
|
|
212
|
-
meaningful_match = False
|
|
213
|
-
for arg in args:
|
|
214
|
-
# Only consider it meaningful if the arg is substantial (not just a common path)
|
|
215
|
-
if len(arg) > 10 and any(arg == cmdline_arg for cmdline_arg in proc_cmdline[1:]):
|
|
216
|
-
meaningful_match = True
|
|
217
|
-
break
|
|
218
|
-
# Or if it's an exact script name match
|
|
219
|
-
elif arg.endswith(".py") or arg.endswith(".sh") or arg.endswith(".rb"):
|
|
220
|
-
if any(arg in cmdline_arg for cmdline_arg in proc_cmdline[1:]):
|
|
221
|
-
meaningful_match = True
|
|
222
|
-
break
|
|
223
|
-
if not meaningful_match:
|
|
224
|
-
is_match = False
|
|
225
|
-
if not is_match:
|
|
226
|
-
continue
|
|
227
|
-
try:
|
|
228
|
-
proc_obj = psutil.Process(info["pid"]) # type: ignore[index]
|
|
229
|
-
if proc_obj.status() not in ["running", "sleeping"]:
|
|
230
|
-
continue
|
|
231
|
-
mem_info = None
|
|
232
|
-
try:
|
|
233
|
-
mem = proc_obj.memory_info()
|
|
234
|
-
mem_info = mem.rss / (1024 * 1024)
|
|
235
|
-
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
236
|
-
pass
|
|
237
|
-
matching_processes.append(
|
|
238
|
-
{
|
|
239
|
-
"pid": info["pid"], # type: ignore[index]
|
|
240
|
-
"name": proc_name,
|
|
241
|
-
"cmdline": proc_cmdline,
|
|
242
|
-
"status": info.get("status", "unknown"),
|
|
243
|
-
"cmdline_str": joined_cmdline,
|
|
244
|
-
"create_time": info.get("create_time", 0.0),
|
|
245
|
-
**({"memory_mb": float(mem_info)} if mem_info is not None else {}),
|
|
246
|
-
}
|
|
247
|
-
)
|
|
248
|
-
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
249
|
-
continue
|
|
250
|
-
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|
251
|
-
continue
|
|
252
|
-
|
|
253
|
-
# Second-pass filtering: remove idle wrapper shells that have no meaningful (non-shell) descendants
|
|
254
|
-
filtered_active: list[ProcessInfo] = []
|
|
255
|
-
for proc_info in matching_processes:
|
|
256
|
-
try:
|
|
257
|
-
proc_obj = psutil.Process(proc_info["pid"]) # type: ignore[index]
|
|
258
|
-
if not proc_obj.is_running():
|
|
259
|
-
continue
|
|
260
|
-
status_val = proc_obj.status()
|
|
261
|
-
if status_val not in ["running", "sleeping"]:
|
|
262
|
-
continue
|
|
263
|
-
proc_name = proc_info.get("name", "")
|
|
264
|
-
if proc_name in shells:
|
|
265
|
-
descendants = proc_obj.children(recursive=True)
|
|
266
|
-
# Keep shell only if there exists a non-shell alive descendant OR descendant cmdline still includes our command token
|
|
267
|
-
meaningful = False
|
|
268
|
-
for child in descendants:
|
|
269
|
-
try:
|
|
270
|
-
if not child.is_running():
|
|
271
|
-
continue
|
|
272
|
-
child_name = child.name()
|
|
273
|
-
child_cmdline = " ".join(child.cmdline())
|
|
274
|
-
if child_name not in shells:
|
|
275
|
-
meaningful = True
|
|
276
|
-
break
|
|
277
|
-
if cmd in child_cmdline or any(arg in child_cmdline for arg in args):
|
|
278
|
-
meaningful = True
|
|
279
|
-
break
|
|
280
|
-
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
281
|
-
continue
|
|
282
|
-
if not meaningful:
|
|
283
|
-
continue # discard idle wrapper shell
|
|
284
|
-
filtered_active.append(proc_info)
|
|
285
|
-
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|
286
|
-
continue
|
|
287
|
-
|
|
288
|
-
if filtered_active:
|
|
289
|
-
# Heuristic: if the only remaining processes are wrapper shells invoking a script that already completed, mark as not running.
|
|
290
|
-
# Case: layout launches 'bash <script.sh>' where script finishes and leaves an idle shell whose cmdline still shows the script path.
|
|
291
|
-
try:
|
|
292
|
-
if all(p.get("name") in shells for p in filtered_active):
|
|
293
|
-
script_paths = [arg for arg in args if arg.endswith(".sh")]
|
|
294
|
-
shell_only = True
|
|
295
|
-
stale_script_overall = False
|
|
296
|
-
for p in filtered_active:
|
|
297
|
-
proc_shell = psutil.Process(p["pid"]) # type: ignore[index]
|
|
298
|
-
create_time = getattr(proc_shell, "create_time", lambda: None)()
|
|
299
|
-
cmdline_joined = " ".join(p.get("cmdline", []))
|
|
300
|
-
stale_script = False
|
|
301
|
-
for spath in script_paths:
|
|
302
|
-
script_file = Path(spath)
|
|
303
|
-
if script_file.exists():
|
|
304
|
-
try:
|
|
305
|
-
# If script mtime older than process start AND no non-shell descendants -> likely finished
|
|
306
|
-
if create_time and script_file.stat().st_mtime < create_time:
|
|
307
|
-
stale_script = True
|
|
308
|
-
except OSError:
|
|
309
|
-
pass
|
|
310
|
-
if spath not in cmdline_joined:
|
|
311
|
-
stale_script = False
|
|
312
|
-
# If shell has any alive non-shell descendants, treat as running
|
|
313
|
-
descendants = proc_shell.children(recursive=True)
|
|
314
|
-
for d in descendants:
|
|
315
|
-
try:
|
|
316
|
-
if d.is_running() and d.name() not in shells:
|
|
317
|
-
shell_only = False
|
|
318
|
-
break
|
|
319
|
-
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
320
|
-
continue
|
|
321
|
-
if not shell_only:
|
|
322
|
-
break
|
|
323
|
-
if stale_script:
|
|
324
|
-
stale_script_overall = True
|
|
325
|
-
if shell_only and stale_script_overall:
|
|
326
|
-
return {"status": "not_running", "running": False, "processes": [], "command": command, "cwd": cwd, "tab_name": tab_name}
|
|
327
|
-
except Exception:
|
|
328
|
-
pass
|
|
329
|
-
return {"status": "running", "running": True, "processes": filtered_active, "command": command, "cwd": cwd, "tab_name": tab_name}
|
|
330
|
-
return {"status": "not_running", "running": False, "processes": [], "command": command, "cwd": cwd, "tab_name": tab_name}
|
|
331
|
-
|
|
332
|
-
except Exception as e:
|
|
333
|
-
logger.error(f"Error checking command status for tab '{tab_name}': {e}")
|
|
334
|
-
return {"status": "error", "error": str(e), "running": False, "command": command, "cwd": cwd, "tab_name": tab_name, "processes": []}
|
|
29
|
+
|
|
30
|
+
def create_zellij_layout(layout_config: LayoutConfig, layout_template: str) -> str:
|
|
31
|
+
"""Standalone function to create Zellij layout content from config."""
|
|
32
|
+
validate_layout_config(layout_config)
|
|
33
|
+
# Enhanced Rich logging
|
|
34
|
+
tab_count = len(layout_config["layoutTabs"])
|
|
35
|
+
layout_name = layout_config["layoutName"]
|
|
36
|
+
console.print(f"[bold cyan]📋 Creating Zellij layout[/bold cyan] [bright_green]'{layout_name}' with {tab_count} tabs[/bright_green]")
|
|
37
|
+
|
|
38
|
+
# Display tab summary with emojis and colors
|
|
39
|
+
for tab in layout_config["layoutTabs"]:
|
|
40
|
+
console.print(f" [yellow]→[/yellow] [bold]{tab['tabName']}[/bold] [dim]in[/dim] [blue]{tab['startDir']}[/blue]")
|
|
41
|
+
from copy import deepcopy
|
|
42
|
+
layout_config = deepcopy(layout_config) # Avoid mutating the original
|
|
43
|
+
layout_content = layout_template
|
|
44
|
+
for tab in layout_config["layoutTabs"]:
|
|
45
|
+
layout_content += "\n" + create_tab_section(tab)
|
|
46
|
+
layout_content += "\n}\n"
|
|
47
|
+
|
|
48
|
+
console.print("[bold green]✅ Zellij layout content generated[/bold green]")
|
|
49
|
+
return layout_content
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ZellijLayoutGenerator:
|
|
53
|
+
def __init__(self, layout_config: LayoutConfig, session_name: str):
|
|
54
|
+
self.session_name: str = session_name
|
|
55
|
+
self.layout_config: LayoutConfig = layout_config.copy()
|
|
56
|
+
self.layout_path: Optional[str] = None
|
|
57
|
+
def create_layout_file(self) -> bool:
|
|
58
|
+
"""Create zellij layout file and return the path."""
|
|
59
|
+
layout_content = create_zellij_layout(self.layout_config, layout_template=DEFAULT_LAYOUT_TEMPLATE)
|
|
60
|
+
# Write to file
|
|
61
|
+
tmp_dir = Path.home() / "tmp_results" / "sessions" / "zellij_layouts"
|
|
62
|
+
tmp_dir.mkdir(parents=True, exist_ok=True)
|
|
63
|
+
import tempfile
|
|
64
|
+
layout_file = Path(tempfile.mkstemp(suffix="_layout.kdl", dir=tmp_dir)[1])
|
|
65
|
+
layout_file.write_text(layout_content, encoding="utf-8")
|
|
66
|
+
self.layout_path = str(layout_file.absolute())
|
|
67
|
+
|
|
68
|
+
console.print(f"[bold green]✅ Layout created successfully:[/bold green] [cyan]{self.layout_path}[/cyan]")
|
|
69
|
+
return True
|
|
335
70
|
|
|
336
71
|
def check_all_commands_status(self) -> dict[str, CommandStatus]:
|
|
337
72
|
if not self.layout_config:
|
|
@@ -341,41 +76,16 @@ class ZellijLayoutGenerator:
|
|
|
341
76
|
status_report: dict[str, CommandStatus] = {}
|
|
342
77
|
for tab in self.layout_config["layoutTabs"]:
|
|
343
78
|
tab_name = tab["tabName"]
|
|
344
|
-
status_report[tab_name] =
|
|
79
|
+
status_report[tab_name] = check_command_status(tab_name, self.layout_config)
|
|
345
80
|
|
|
346
81
|
return status_report
|
|
347
82
|
|
|
348
|
-
@staticmethod
|
|
349
|
-
def check_zellij_session_status(session_name: str) -> ZellijSessionStatus:
|
|
350
|
-
try:
|
|
351
|
-
# Run zellij list-sessions command
|
|
352
|
-
result = subprocess.run(["zellij", "list-sessions"], capture_output=True, text=True, timeout=10)
|
|
353
|
-
|
|
354
|
-
if result.returncode == 0:
|
|
355
|
-
sessions = result.stdout.strip().split("\n") if result.stdout.strip() else []
|
|
356
|
-
session_running = any(session_name in session for session in sessions)
|
|
357
|
-
|
|
358
|
-
return {"zellij_running": True, "session_exists": session_running, "session_name": session_name, "all_sessions": sessions}
|
|
359
|
-
else:
|
|
360
|
-
return {"zellij_running": False, "session_exists": False, "session_name": session_name, "all_sessions": [], "error": result.stderr}
|
|
361
|
-
|
|
362
|
-
except subprocess.TimeoutExpired:
|
|
363
|
-
return {"zellij_running": False, "session_exists": False, "session_name": session_name, "all_sessions": [], "error": "Timeout while checking Zellij sessions"}
|
|
364
|
-
except FileNotFoundError:
|
|
365
|
-
return {"zellij_running": False, "session_exists": False, "session_name": session_name, "all_sessions": [], "error": "Zellij not found in PATH"}
|
|
366
|
-
except Exception as e:
|
|
367
|
-
return {"zellij_running": False, "session_exists": False, "session_name": session_name, "all_sessions": [], "error": str(e)}
|
|
368
|
-
|
|
369
83
|
def get_comprehensive_status(self) -> ComprehensiveStatus:
|
|
370
|
-
zellij_status =
|
|
84
|
+
zellij_status = check_zellij_session_status(self.session_name or "default")
|
|
371
85
|
commands_status = self.check_all_commands_status()
|
|
372
86
|
running_count = sum(1 for status in commands_status.values() if status.get("running", False))
|
|
373
87
|
total_count = len(commands_status)
|
|
374
|
-
return {
|
|
375
|
-
"zellij_session": zellij_status,
|
|
376
|
-
"commands": commands_status,
|
|
377
|
-
"summary": {"total_commands": total_count, "running_commands": running_count, "stopped_commands": total_count - running_count, "session_healthy": zellij_status.get("session_exists", False)},
|
|
378
|
-
}
|
|
88
|
+
return {"zellij_session": zellij_status, "commands": commands_status, "summary": {"total_commands": total_count, "running_commands": running_count, "stopped_commands": total_count - running_count, "session_healthy": zellij_status.get("session_exists", False)}}
|
|
379
89
|
|
|
380
90
|
def print_status_report(self) -> None:
|
|
381
91
|
from rich.panel import Panel
|
|
@@ -446,26 +156,29 @@ class ZellijLayoutGenerator:
|
|
|
446
156
|
|
|
447
157
|
console.print(Panel(summary_text, title="📊 Summary", style="blue"))
|
|
448
158
|
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
159
|
+
def restart_tab(self, tab_name: str) -> bool:
|
|
160
|
+
"""Restart the process running in a specific tab without changing the layout.
|
|
161
|
+
|
|
162
|
+
This method will:
|
|
163
|
+
1. Navigate to the specified tab
|
|
164
|
+
2. Send Ctrl+C to stop the running process
|
|
165
|
+
3. Clear the screen
|
|
166
|
+
4. Re-execute the original command
|
|
167
|
+
|
|
168
|
+
The tab layout and configuration remain unchanged - only the process is restarted.
|
|
169
|
+
"""
|
|
170
|
+
return restart_tab_process(tab_name=tab_name, layout_config=self.layout_config, session_name=self.session_name)
|
|
171
|
+
|
|
172
|
+
def run(self):
|
|
173
|
+
from machineconfig.cluster.sessions_managers.helpers.enhanced_command_runner import enhanced_zellij_session_start
|
|
174
|
+
enhanced_zellij_session_start(session_name=self.session_name, layout_path=str(self.layout_path))
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def run_zellij_layout(layout_config: LayoutConfig) -> None:
|
|
457
178
|
session_name = layout_config["layoutName"]
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
enhanced_zellij_session_start(session_name, layout_path)
|
|
462
|
-
except ImportError:
|
|
463
|
-
# Fallback to original implementation
|
|
464
|
-
cmd = f"zellij delete-session --force {session_name}; zellij --layout {layout_path} a -b {session_name}"
|
|
465
|
-
import subprocess
|
|
466
|
-
|
|
467
|
-
subprocess.run(cmd, shell=True, check=True)
|
|
468
|
-
console.print(f"[bold green]🚀 Zellij layout is running[/bold green] [yellow]@[/yellow] [bold cyan]{session_name}[/bold cyan]")
|
|
179
|
+
generator = ZellijLayoutGenerator(layout_config, session_name)
|
|
180
|
+
generator.create_layout_file()
|
|
181
|
+
generator.run()
|
|
469
182
|
|
|
470
183
|
|
|
471
184
|
def run_command_in_zellij_tab(command: str, tab_name: str, cwd: Optional[str]) -> str:
|
|
@@ -493,30 +206,23 @@ if __name__ == "__main__":
|
|
|
493
206
|
# Example usage with new schema
|
|
494
207
|
sample_layout: LayoutConfig = {
|
|
495
208
|
"layoutName": "SampleBots",
|
|
496
|
-
"layoutTabs": [
|
|
497
|
-
{"tabName": "🤖Bot1", "startDir": "~/code/bytesense/bithence", "command": "~/scripts/fire -mO go1.py bot1 -- --create_new_bot=True"},
|
|
498
|
-
{"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "~/scripts/fire -mO go2.py bot2 -- --create_new_bot=True"},
|
|
499
|
-
{"tabName": "📊Monitor", "startDir": "~", "command": "htop"},
|
|
500
|
-
{"tabName": "📝Logs", "startDir": "/var/log", "command": "tail -f /var/log/app.log"},
|
|
501
|
-
],
|
|
209
|
+
"layoutTabs": [{"tabName": "Explorer", "startDir": "~/code", "command": "lf"}, {"tabName": "🤖Bot2", "startDir": "~", "command": "cmatrix"}, {"tabName": "📊Monitor", "startDir": "~", "command": "htop"}, {"tabName": "📝Logs", "startDir": "/var/log", "command": "tail -f /var/log/app.log"}],
|
|
502
210
|
}
|
|
503
|
-
|
|
504
211
|
try:
|
|
505
|
-
# Create layout using the generator
|
|
506
|
-
generator = ZellijLayoutGenerator()
|
|
507
|
-
|
|
508
|
-
print(f"✅ Layout created successfully: {layout_path}")
|
|
212
|
+
# Create layout using the generator with new design
|
|
213
|
+
generator = ZellijLayoutGenerator(layout_config=sample_layout, session_name="test_session")
|
|
214
|
+
generator.create_layout_file()
|
|
509
215
|
|
|
216
|
+
generator.run()
|
|
510
217
|
# Demonstrate status checking
|
|
511
218
|
print("\n🔍 Checking command status (this is just a demo - commands aren't actually running):")
|
|
512
219
|
generator.print_status_report()
|
|
513
220
|
|
|
514
221
|
# Individual command status check
|
|
515
|
-
print("\n🔎 Individual command status for
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
print(f"Running: {bot1_status['running']}")
|
|
222
|
+
print("\n🔎 Individual command status for 🤖Bot2:")
|
|
223
|
+
bot2_status = check_command_status("🤖Bot2", generator.layout_config)
|
|
224
|
+
print(f"Status: {bot2_status['status']}")
|
|
225
|
+
print(f"Running: {bot2_status['running']}")
|
|
520
226
|
|
|
521
227
|
except Exception as e:
|
|
522
228
|
print(f"❌ Error: {e}")
|