machineconfig 3.7__py3-none-any.whl → 7.69__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 +7 -21
- machineconfig/jobs/installer/custom/boxes.py +61 -0
- machineconfig/jobs/installer/custom/gh.py +128 -0
- machineconfig/jobs/{python_custom_installers → installer/custom}/hx.py +84 -18
- machineconfig/jobs/installer/custom_dev/alacritty.py +86 -0
- machineconfig/jobs/installer/custom_dev/brave.py +82 -0
- machineconfig/jobs/installer/custom_dev/bypass_paywall.py +59 -0
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +63 -0
- machineconfig/jobs/{python_custom_installers/dev → installer/custom_dev}/cursor.py +7 -7
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
- machineconfig/jobs/installer/custom_dev/espanso.py +117 -0
- machineconfig/jobs/installer/custom_dev/goes.py +68 -0
- machineconfig/jobs/installer/custom_dev/lvim.py +89 -0
- machineconfig/jobs/installer/custom_dev/nerdfont.py +111 -0
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +149 -0
- machineconfig/jobs/installer/custom_dev/redis.py +88 -0
- machineconfig/jobs/installer/custom_dev/sysabc.py +145 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +92 -0
- machineconfig/jobs/{python_custom_installers/dev → installer/custom_dev}/winget.py +2 -3
- machineconfig/jobs/installer/installer_data.json +3440 -0
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/brave.sh +4 -14
- machineconfig/jobs/{python_custom_installers/scripts/linux/warp-cli.sh → installer/linux_scripts/cloudflare_warp_cli.sh} +5 -17
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/docker.sh +6 -18
- machineconfig/jobs/installer/linux_scripts/docker_start.sh +37 -0
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/edge.sh +3 -11
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
- machineconfig/jobs/{python_custom_installers/scripts/linux → 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/{python_custom_installers/scripts/linux → installer/linux_scripts}/redis.sh +6 -17
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/vscode.sh +5 -17
- machineconfig/jobs/{python_custom_installers/scripts/linux → 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/__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/{mcinit.py → initai.py} +3 -38
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +114 -0
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +88 -22
- machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -1
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/gemini/settings.json +1 -1
- 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 +129 -198
- machineconfig/scripts/python/define.py +31 -0
- machineconfig/scripts/python/devops.py +45 -131
- machineconfig/scripts/python/devops_navigator.py +6 -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/fire_jobs.py +166 -235
- machineconfig/scripts/python/ftpx.py +164 -100
- machineconfig/scripts/python/helpers/ast_search.py +74 -0
- machineconfig/scripts/python/helpers/repo_rag.py +325 -0
- machineconfig/scripts/python/helpers/symantic_search.py +25 -0
- 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} +52 -39
- machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +13 -18
- machineconfig/scripts/python/helpers_cloud/cloud_sync.py +81 -0
- machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -1
- machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +32 -20
- 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/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -2
- machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -89
- 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_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 +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_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/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 +187 -0
- machineconfig/scripts/python/mcfg_entry.py +63 -0
- machineconfig/scripts/python/msearch.py +40 -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 -51
- machineconfig/scripts/python/nw/wsl_windows_transfer.py +67 -0
- machineconfig/scripts/python/sessions.py +167 -0
- machineconfig/scripts/python/terminal.py +127 -0
- machineconfig/scripts/python/utils.py +66 -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 +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/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 +55 -31
- machineconfig/settings/shells/nushell/config.nu +1 -34
- machineconfig/settings/shells/nushell/init.nu +127 -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/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 +14 -1
- 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 +28 -203
- 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 +17 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -189
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
- machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
- machineconfig/utils/accessories.py +52 -12
- 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/decompress.py +45 -0
- machineconfig/utils/files/read.py +95 -0
- machineconfig/utils/installer_utils/github_release_bulk.py +188 -0
- machineconfig/utils/installer_utils/install_from_url.py +180 -0
- machineconfig/utils/installer_utils/installer_class.py +239 -316
- machineconfig/utils/installer_utils/installer_cli.py +186 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +90 -5
- machineconfig/utils/installer_utils/installer_runner.py +191 -0
- machineconfig/utils/io.py +77 -24
- machineconfig/utils/links.py +309 -100
- machineconfig/utils/meta.py +255 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +19 -47
- machineconfig/utils/path_extended.py +111 -121
- 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 +28 -6
- machineconfig/utils/schemas/layouts/layout_types.py +34 -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.69.dist-info/METADATA +124 -0
- machineconfig-7.69.dist-info/RECORD +454 -0
- machineconfig-7.69.dist-info/entry_points.txt +15 -0
- machineconfig/cluster/templates/cli_click.py +0 -102
- machineconfig/cluster/templates/cli_gooey.py +0 -115
- machineconfig/cluster/templates/utils.py +0 -51
- machineconfig/jobs/linux/msc/cli_agents.sh +0 -32
- 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 -48
- machineconfig/jobs/python/vscode/link_ve.py +0 -63
- machineconfig/jobs/python/vscode/select_interpreter.py +0 -87
- machineconfig/jobs/python/vscode/sync_code.py +0 -58
- machineconfig/jobs/python_custom_installers/archive/ngrok.py +0 -63
- machineconfig/jobs/python_custom_installers/dev/aider.py +0 -37
- machineconfig/jobs/python_custom_installers/dev/alacritty.py +0 -65
- machineconfig/jobs/python_custom_installers/dev/brave.py +0 -71
- machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +0 -50
- machineconfig/jobs/python_custom_installers/dev/code.py +0 -51
- machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +0 -78
- machineconfig/jobs/python_custom_installers/dev/espanso.py +0 -90
- machineconfig/jobs/python_custom_installers/dev/goes.py +0 -55
- machineconfig/jobs/python_custom_installers/dev/lvim.py +0 -77
- machineconfig/jobs/python_custom_installers/dev/nerdfont.py +0 -68
- machineconfig/jobs/python_custom_installers/dev/redis.py +0 -65
- machineconfig/jobs/python_custom_installers/dev/reverse_proxy.md +0 -31
- machineconfig/jobs/python_custom_installers/dev/wezterm.py +0 -70
- machineconfig/jobs/python_custom_installers/docker.py +0 -74
- machineconfig/jobs/python_custom_installers/gh.py +0 -97
- machineconfig/jobs/python_custom_installers/scripts/linux/docker_start.sh +0 -45
- machineconfig/jobs/python_custom_installers/scripts/linux/pgsql.sh +0 -49
- machineconfig/jobs/python_custom_installers/scripts/linux/timescaledb.sh +0 -85
- machineconfig/jobs/python_custom_installers/warp-cli.py +0 -71
- machineconfig/jobs/python_generic_installers/config.json +0 -603
- machineconfig/jobs/python_generic_installers/config.json.bak +0 -414
- machineconfig/jobs/python_generic_installers/dev/config.archive.json +0 -18
- machineconfig/jobs/python_generic_installers/dev/config.json +0 -825
- machineconfig/jobs/python_generic_installers/dev/config.json.bak +0 -565
- machineconfig/jobs/python_linux_installers/archive/config.json +0 -18
- machineconfig/jobs/python_linux_installers/archive/config.json.bak +0 -10
- machineconfig/jobs/python_linux_installers/config.json +0 -145
- machineconfig/jobs/python_linux_installers/config.json.bak +0 -110
- machineconfig/jobs/python_linux_installers/dev/config.json +0 -276
- machineconfig/jobs/python_linux_installers/dev/config.json.bak +0 -206
- machineconfig/jobs/python_windows_installers/archive/file.json +0 -11
- machineconfig/jobs/python_windows_installers/config.json +0 -82
- machineconfig/jobs/python_windows_installers/config.json.bak +0 -56
- machineconfig/jobs/python_windows_installers/dev/config.json +0 -4
- machineconfig/jobs/python_windows_installers/dev/config.json.bak +0 -3
- 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 -169
- 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/kill_process +0 -2
- machineconfig/scripts/linux/mcinit +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/archive/im2text.py +0 -34
- machineconfig/scripts/python/archive/tmate_conn.py +0 -41
- machineconfig/scripts/python/archive/tmate_start.py +0 -44
- machineconfig/scripts/python/cloud_repo_sync.py +0 -192
- machineconfig/scripts/python/cloud_sync.py +0 -85
- machineconfig/scripts/python/devops_devapps_install.py +0 -202
- machineconfig/scripts/python/devops_update_repos.py +0 -180
- machineconfig/scripts/python/dotfile.py +0 -52
- machineconfig/scripts/python/fire_agents.py +0 -176
- 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 -84
- machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -66
- 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 -160
- machineconfig/scripts/python/snapshot.py +0 -25
- machineconfig/scripts/python/start_terminals.py +0 -121
- machineconfig/scripts/python/wsl_windows_transfer.py +0 -72
- 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/kill_process.ps1 +0 -1
- machineconfig/scripts/windows/mcinit.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/setup_windows/wt_and_pwsh/install_nerd_fonts.py +0 -100
- machineconfig/utils/ai/generate_file_checklist.py +0 -68
- machineconfig/utils/installer.py +0 -255
- machineconfig-3.7.dist-info/METADATA +0 -165
- machineconfig-3.7.dist-info/RECORD +0 -432
- machineconfig-3.7.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/jobs/{python → installer}/__init__.py +0 -0
- machineconfig/jobs/{python_custom_installers → installer/custom_dev}/__init__.py +0 -0
- machineconfig/{setup_windows/wt_and_pwsh → jobs/installer/powershell_scripts}/install_fonts.ps1 +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_generic_installers → scripts/python/helpers_agents}/__init__.py +0 -0
- machineconfig/{jobs/python_linux_installers → 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/{jobs/python_linux_installers/dev → 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/python_windows_installers → scripts/python/helpers_croshell}/__init__.py +0 -0
- /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.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/{jobs/python_windows_installers/archive → scripts/python/helpers_devops}/__init__.py +0 -0
- /machineconfig/{jobs/python_windows_installers/dev → scripts/python/helpers_devops/themes}/__init__.py +0 -0
- /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
- /machineconfig/scripts/python/{helpers → helpers_fire_command}/__init__.py +0 -0
- /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_fire_command/fire_jobs_streamlit_helper.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/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_sessions/__init__.py} +0 -0
- /machineconfig/scripts/{windows/share_nfs.ps1 → python/nw/__init__.py} +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/{settings/yazi/keymap.toml → utils/files/ouch/__init__.py} +0 -0
- {machineconfig-3.7.dist-info → machineconfig-7.69.dist-info}/WHEEL +0 -0
- {machineconfig-3.7.dist-info → machineconfig-7.69.dist-info}/top_level.txt +0 -0
machineconfig/utils/procs.py
CHANGED
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
import psutil
|
|
4
4
|
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
5
|
-
from zoneinfo import ZoneInfo
|
|
6
5
|
from machineconfig.utils.options import choose_from_options
|
|
7
|
-
from typing import Optional,
|
|
6
|
+
from typing import Optional, TypedDict, List, Dict
|
|
8
7
|
from rich.console import Console
|
|
9
8
|
from rich.panel import Panel
|
|
10
|
-
from datetime import datetime
|
|
9
|
+
from datetime import datetime
|
|
11
10
|
from machineconfig.utils.accessories import pprint
|
|
12
11
|
|
|
13
12
|
console = Console()
|
|
@@ -15,11 +14,29 @@ console = Console()
|
|
|
15
14
|
BOX_WIDTH = 78 # width for box drawing
|
|
16
15
|
|
|
17
16
|
|
|
18
|
-
|
|
17
|
+
class ProcessInfo(TypedDict):
|
|
18
|
+
"""TypedDict for process information."""
|
|
19
|
+
command: str
|
|
20
|
+
pid: int
|
|
21
|
+
name: str
|
|
22
|
+
username: str
|
|
23
|
+
cpu_percent: float
|
|
24
|
+
memory_usage_mb: float
|
|
25
|
+
status: str
|
|
26
|
+
create_time: datetime
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class FileAccessInfo(TypedDict):
|
|
30
|
+
"""TypedDict for file access information."""
|
|
31
|
+
pid: int
|
|
32
|
+
files: List[str]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def get_processes_accessing_file(path: str) -> List[FileAccessInfo]:
|
|
19
36
|
# header for searching processes
|
|
20
37
|
title = "🔍 SEARCHING FOR PROCESSES ACCESSING FILE"
|
|
21
38
|
console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
22
|
-
res:
|
|
39
|
+
res: Dict[int, List[str]] = {}
|
|
23
40
|
|
|
24
41
|
with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
|
|
25
42
|
progress.add_task("🔎 Scanning processes...", total=None)
|
|
@@ -34,22 +51,22 @@ def get_processes_accessing_file(path: str):
|
|
|
34
51
|
res[proc.pid] = tmp
|
|
35
52
|
|
|
36
53
|
# Convert to list of dictionaries for consistent data structure
|
|
37
|
-
result_data = [{"pid": pid, "files": files} for pid, files in res.items()]
|
|
54
|
+
result_data: List[FileAccessInfo] = [{"pid": pid, "files": files} for pid, files in res.items()]
|
|
38
55
|
console.print(Panel(f"✅ Found {len(res)} processes accessing the specified file", title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
39
56
|
return result_data
|
|
40
57
|
|
|
41
58
|
|
|
42
59
|
def kill_process(name: str):
|
|
43
|
-
print(f"⚠️ Attempting to kill process: {name}...")
|
|
60
|
+
console.print(f"⚠️ Attempting to kill process: {name}...", style="yellow")
|
|
44
61
|
killed = False
|
|
45
62
|
for proc in psutil.process_iter():
|
|
46
63
|
if proc.name() == name:
|
|
47
64
|
proc.kill()
|
|
48
|
-
print(f"💀 Process {name} (PID: {proc.pid}) terminated successfully")
|
|
65
|
+
console.print(f"💀 Process {name} (PID: {proc.pid}) terminated successfully", style="green")
|
|
49
66
|
killed = True
|
|
50
67
|
if not killed:
|
|
51
|
-
print(f"❓ No process with name '{name}' was found")
|
|
52
|
-
|
|
68
|
+
console.print(f"❓ No process with name '{name}' was found", style="red")
|
|
69
|
+
console.rule(style="dim")
|
|
53
70
|
|
|
54
71
|
|
|
55
72
|
class ProcessManager:
|
|
@@ -57,17 +74,13 @@ class ProcessManager:
|
|
|
57
74
|
# header for initializing process manager
|
|
58
75
|
title = "📊 INITIALIZING PROCESS MANAGER"
|
|
59
76
|
console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
60
|
-
process_info = []
|
|
61
|
-
|
|
77
|
+
process_info: List[ProcessInfo] = []
|
|
62
78
|
with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
|
|
63
79
|
progress.add_task("🔍 Reading system processes...", total=None)
|
|
64
|
-
|
|
65
80
|
for proc in psutil.process_iter():
|
|
66
81
|
try:
|
|
67
82
|
mem_usage_mb = proc.memory_info().rss / (1024 * 1024)
|
|
68
|
-
|
|
69
|
-
create_time_utc = datetime.fromtimestamp(proc.create_time(), tz=timezone.utc)
|
|
70
|
-
create_time_local = create_time_utc.astimezone(ZoneInfo("Australia/Adelaide"))
|
|
83
|
+
create_time = datetime.fromtimestamp(proc.create_time(), tz=None)
|
|
71
84
|
|
|
72
85
|
process_info.append(
|
|
73
86
|
{
|
|
@@ -77,7 +90,7 @@ class ProcessManager:
|
|
|
77
90
|
"cpu_percent": proc.cpu_percent(),
|
|
78
91
|
"memory_usage_mb": mem_usage_mb,
|
|
79
92
|
"status": proc.status(),
|
|
80
|
-
"create_time":
|
|
93
|
+
"create_time": create_time,
|
|
81
94
|
"command": " ".join(proc.cmdline()),
|
|
82
95
|
}
|
|
83
96
|
)
|
|
@@ -93,57 +106,51 @@ class ProcessManager:
|
|
|
93
106
|
"""Format process data as table string for display."""
|
|
94
107
|
if not self.data:
|
|
95
108
|
return ""
|
|
96
|
-
|
|
97
109
|
# Create header
|
|
98
|
-
_headers = ["PID", "Name", "Username", "CPU%", "Memory(MB)", "Status", "Create Time"
|
|
99
|
-
header_line = f"{'PID':<8} {'Name':<20} {'Username':<12} {'CPU%':<8} {'Memory(MB)':<12} {'Status':<12} {'Create Time':<20}
|
|
110
|
+
_headers = ["Command", "PID", "Name", "Username", "CPU%", "Memory(MB)", "Status", "Create Time"]
|
|
111
|
+
header_line = f"{'Command':<50} {'PID':<8} {'Name':<20} {'Username':<12} {'CPU%':<8} {'Memory(MB)':<12} {'Status':<12} {'Create Time':<20}"
|
|
100
112
|
separator = "-" * len(header_line)
|
|
101
|
-
|
|
102
113
|
lines = [header_line, separator]
|
|
103
|
-
|
|
104
114
|
for process in self.data:
|
|
105
115
|
# Format create_time as string
|
|
106
116
|
create_time_str = process["create_time"].strftime("%Y-%m-%d %H:%M:%S")
|
|
107
117
|
# Truncate command if too long
|
|
108
118
|
command = process["command"][:47] + "..." if len(process["command"]) > 50 else process["command"]
|
|
109
|
-
|
|
110
|
-
line = f"{process['pid']:<8} {process['name'][:19]:<20} {process['username'][:11]:<12} {process['cpu_percent']:<8.1f} {process['memory_usage_mb']:<12.2f} {process['status'][:11]:<12} {create_time_str:<20} {command:<50}"
|
|
119
|
+
line = f"{command:<50} {process['pid']:<8} {process['name'][:19]:<20} {process['username'][:11]:<12} {process['cpu_percent']:<8.1f} {process['memory_usage_mb']:<12.2f} {process['status'][:11]:<12} {create_time_str:<20}"
|
|
111
120
|
lines.append(line)
|
|
112
|
-
|
|
113
121
|
return "\n".join(lines)
|
|
114
122
|
|
|
115
123
|
def choose_and_kill(self):
|
|
116
124
|
# header for interactive process selection
|
|
117
125
|
title = "🎯 INTERACTIVE PROCESS SELECTION AND TERMINATION"
|
|
118
126
|
console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
119
|
-
|
|
120
127
|
# Format data as table for display
|
|
121
128
|
formatted_data = self._format_process_table()
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
129
|
+
all_lines = formatted_data.split("\n")
|
|
130
|
+
header_and_separator = all_lines[:2] # First two lines: header and separator
|
|
131
|
+
options = all_lines[2:] # Skip header and separator, only process lines
|
|
132
|
+
res = choose_from_options(options=all_lines, msg="📋 Select processes to manage:", fzf=True, multi=True)
|
|
133
|
+
# Filter out header and separator if they were selected
|
|
134
|
+
selected_lines = [line for line in res if line not in header_and_separator]
|
|
135
|
+
indices = [options.index(val) for val in selected_lines]
|
|
125
136
|
selected_processes = [self.data[i] for i in indices]
|
|
126
|
-
|
|
127
137
|
print("\n📊 All Processes:")
|
|
128
138
|
print(formatted_data)
|
|
129
139
|
print("\n🎯 Selected Processes:")
|
|
130
140
|
for process in selected_processes:
|
|
131
141
|
print(f"PID: {process['pid']}, Name: {process['name']}, Memory: {process['memory_usage_mb']:.2f}MB")
|
|
132
|
-
|
|
133
142
|
for idx, process in enumerate(selected_processes):
|
|
134
|
-
pprint(process, f"📌 Process {idx}")
|
|
135
|
-
|
|
143
|
+
pprint(dict(process), f"📌 Process {idx}")
|
|
136
144
|
kill_all = input("\n⚠️ Confirm killing ALL selected processes? y/[n] ").lower() == "y"
|
|
137
145
|
if kill_all:
|
|
138
146
|
self.kill(pids=[p["pid"] for p in selected_processes])
|
|
139
147
|
return
|
|
140
|
-
|
|
141
148
|
kill_by_index = input("\n🔫 Kill by index? (enter numbers separated by spaces, e.g. '1 4') or [n] to cancel: ")
|
|
142
149
|
if kill_by_index != "" and kill_by_index != "n":
|
|
143
150
|
indices = [int(val) for val in kill_by_index.split(" ")]
|
|
144
151
|
target_processes = [selected_processes[i] for i in indices]
|
|
145
152
|
for idx2, process in enumerate(target_processes):
|
|
146
|
-
pprint(process, f"🎯 Target Process {idx2}")
|
|
153
|
+
pprint(dict(process), f"🎯 Target Process {idx2}")
|
|
147
154
|
_ = self.kill(pids=[p["pid"] for p in target_processes]) if input("\n⚠️ Confirm termination? y/[n] ").lower() == "y" else None
|
|
148
155
|
console.print(Panel("🔔 No processes were terminated.", title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
149
156
|
|
|
@@ -151,18 +158,15 @@ class ProcessManager:
|
|
|
151
158
|
# header for filtering processes by name
|
|
152
159
|
title = "🔍 FILTERING AND TERMINATING PROCESSES BY NAME"
|
|
153
160
|
console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
154
|
-
|
|
155
161
|
# Filter processes by name
|
|
156
162
|
filtered_processes = [p for p in self.data if p["name"] == name]
|
|
157
163
|
# Sort by create_time (ascending)
|
|
158
164
|
filtered_processes.sort(key=lambda x: x["create_time"])
|
|
159
|
-
|
|
160
165
|
print(f"🎯 Found {len(filtered_processes)} processes matching name: '{name}'")
|
|
161
166
|
self.kill(pids=[p["pid"] for p in filtered_processes])
|
|
162
167
|
console.print(Panel("", title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
163
168
|
|
|
164
169
|
def kill(self, names: Optional[list[str]] = None, pids: Optional[list[int]] = None, commands: Optional[list[str]] = None):
|
|
165
|
-
# header for process termination
|
|
166
170
|
title = "💀 PROCESS TERMINATION"
|
|
167
171
|
console.print(Panel(title, title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
168
172
|
if names is None and pids is None and commands is None:
|
|
@@ -174,74 +178,46 @@ class ProcessManager:
|
|
|
174
178
|
pids = []
|
|
175
179
|
if commands is None:
|
|
176
180
|
commands = []
|
|
177
|
-
|
|
178
181
|
killed_count = 0
|
|
179
|
-
|
|
180
182
|
for name in names:
|
|
181
183
|
matching_processes = [p for p in self.data if p["name"] == name]
|
|
182
184
|
if len(matching_processes) > 0:
|
|
183
185
|
for process in matching_processes:
|
|
184
186
|
psutil.Process(process["pid"]).kill()
|
|
185
|
-
print(f"💀 Killed process {name} with PID {process['pid']}. It lived {get_age(process['create_time'])}. RIP
|
|
187
|
+
print(f"💀 Killed process {name} with PID {process['pid']}. It lived {get_age(process['create_time'])}. RIP 💐")
|
|
186
188
|
killed_count += 1
|
|
187
189
|
else:
|
|
188
190
|
print(f'❓ No process named "{name}" found')
|
|
189
|
-
|
|
190
191
|
for pid in pids:
|
|
191
192
|
try:
|
|
192
193
|
proc = psutil.Process(pid)
|
|
193
194
|
proc_name = proc.name()
|
|
194
|
-
proc_lifetime = get_age(proc.create_time())
|
|
195
|
+
proc_lifetime = get_age(datetime.fromtimestamp(proc.create_time(), tz=None))
|
|
195
196
|
proc.kill()
|
|
196
|
-
print(f'💀 Killed process with PID {pid} and name "{proc_name}". It lived {proc_lifetime}. RIP
|
|
197
|
+
print(f'💀 Killed process with PID {pid} and name "{proc_name}". It lived {proc_lifetime}. RIP 💐')
|
|
197
198
|
killed_count += 1
|
|
198
199
|
except psutil.NoSuchProcess:
|
|
199
200
|
print(f"❓ No process with PID {pid} found")
|
|
200
|
-
|
|
201
201
|
for command in commands:
|
|
202
202
|
matching_processes = [p for p in self.data if command in p["command"]]
|
|
203
203
|
if len(matching_processes) > 0:
|
|
204
204
|
for process in matching_processes:
|
|
205
205
|
psutil.Process(process["pid"]).kill()
|
|
206
|
-
print(f'💀 Killed process with "{command}" in its command & PID {process["pid"]}. It lived {get_age(process["create_time"])}. RIP
|
|
206
|
+
print(f'💀 Killed process with "{command}" in its command & PID {process["pid"]}. It lived {get_age(process["create_time"])}. RIP 💐')
|
|
207
207
|
killed_count += 1
|
|
208
208
|
else:
|
|
209
209
|
print(f'❓ No process has "{command}" in its command.')
|
|
210
|
-
|
|
211
210
|
console.print(Panel(f"✅ Termination complete: {killed_count} processes terminated", title="[bold blue]Process Info[/bold blue]", border_style="blue"))
|
|
212
211
|
|
|
213
212
|
|
|
214
|
-
def get_age(create_time:
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
# Handle timestampz
|
|
219
|
-
create_time_utc = datetime.fromtimestamp(create_time, tz=timezone.utc)
|
|
220
|
-
create_time_local = create_time_utc.astimezone(ZoneInfo("Australia/Adelaide"))
|
|
221
|
-
else:
|
|
222
|
-
# Already a datetime object
|
|
223
|
-
create_time_local = create_time
|
|
224
|
-
|
|
225
|
-
now_local = datetime.now(tz=ZoneInfo("Australia/Adelaide"))
|
|
226
|
-
age = now_local - create_time_local
|
|
227
|
-
return str(age)
|
|
228
|
-
except Exception as e:
|
|
229
|
-
try:
|
|
230
|
-
# Fallback without timezone
|
|
231
|
-
if isinstance(create_time, (int, float)):
|
|
232
|
-
create_time_dt = datetime.fromtimestamp(create_time)
|
|
233
|
-
else:
|
|
234
|
-
create_time_dt = create_time.replace(tzinfo=None) if create_time.tzinfo else create_time
|
|
235
|
-
now_dt = datetime.now()
|
|
236
|
-
age = now_dt - create_time_dt
|
|
237
|
-
return str(age)
|
|
238
|
-
except Exception as ee:
|
|
239
|
-
return f"unknown due to {ee} and {e}"
|
|
213
|
+
def get_age(create_time: datetime) -> str:
|
|
214
|
+
dtm_now = datetime.now()
|
|
215
|
+
delta = dtm_now - create_time
|
|
216
|
+
return str(delta).split(".")[0] # remove microseconds
|
|
240
217
|
|
|
241
218
|
|
|
242
219
|
def main():
|
|
243
220
|
from machineconfig.utils.procs import ProcessManager
|
|
244
|
-
|
|
245
221
|
ProcessManager().choose_and_kill()
|
|
246
222
|
|
|
247
223
|
|
machineconfig/utils/scheduler.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
|
|
1
2
|
from pathlib import Path
|
|
2
|
-
from typing import Callable, Optional, Union, Any,
|
|
3
|
+
from typing import Callable, Optional, Union, Any, Protocol, List, TypeVar
|
|
3
4
|
import logging
|
|
4
5
|
import time
|
|
5
6
|
from datetime import datetime, timezone, timedelta
|
|
6
7
|
from machineconfig.utils.io import from_pickle
|
|
7
|
-
from machineconfig.utils.path_extended import PathExtended as PathExtended
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class LoggerTemplate(Protocol):
|
|
@@ -143,145 +143,142 @@ class Scheduler:
|
|
|
143
143
|
raise ex
|
|
144
144
|
|
|
145
145
|
|
|
146
|
-
T = TypeVar("T")
|
|
146
|
+
# T = TypeVar("T")
|
|
147
147
|
T2 = TypeVar("T2")
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
class PrintFunc(Protocol):
|
|
151
|
-
def __call__(self, msg: str) -> Union[NoReturn, None]: ...
|
|
152
|
-
|
|
153
|
-
|
|
154
148
|
def to_pickle(obj: Any, path: Path) -> None:
|
|
155
149
|
import pickle
|
|
156
|
-
|
|
157
|
-
path.parent.mkdir(parents=True, exist_ok=True)
|
|
158
150
|
path.write_bytes(pickle.dumps(obj))
|
|
159
151
|
|
|
160
152
|
|
|
161
|
-
class
|
|
162
|
-
|
|
153
|
+
class CacheMemory[T]():
|
|
154
|
+
def __init__(
|
|
155
|
+
self, source_func: Callable[[], T], expire: timedelta, logger: LoggerTemplate, name: Optional[str] = None
|
|
156
|
+
) -> None:
|
|
157
|
+
self.cache: T
|
|
158
|
+
self.source_func = source_func
|
|
159
|
+
self.time_produced = datetime.now()
|
|
160
|
+
self.logger = logger
|
|
161
|
+
self.expire = expire
|
|
162
|
+
self.name = name if isinstance(name, str) else self.source_func.__name__
|
|
163
|
+
def __call__(self, fresh: bool, tolerance_seconds: float | int) -> T:
|
|
164
|
+
if fresh or not hasattr(self, "cache"):
|
|
165
|
+
why = "There was an explicit fresh order." if fresh else "Previous cache never existed."
|
|
166
|
+
t0 = time.time()
|
|
167
|
+
self.logger.warning(f"""
|
|
168
|
+
🆕 ════════════════════ NEW {self.name} CACHE ════════════════════
|
|
169
|
+
ℹ️ Reason: {why}""")
|
|
170
|
+
self.cache = self.source_func()
|
|
171
|
+
self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
|
|
172
|
+
self.time_produced = datetime.now()
|
|
173
|
+
else:
|
|
174
|
+
age = datetime.now() - self.time_produced
|
|
175
|
+
if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)):
|
|
176
|
+
self.logger.warning(f"""
|
|
177
|
+
🔄 ════════════════════ CACHE UPDATE ════════════════════
|
|
178
|
+
⚠️ {self.name} cache: Updating cache from source func
|
|
179
|
+
⏱️ Age = {age} > {self.expire}""")
|
|
180
|
+
t0 = time.time()
|
|
181
|
+
self.cache = self.source_func()
|
|
182
|
+
self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
|
|
183
|
+
self.time_produced = datetime.now()
|
|
184
|
+
else:
|
|
185
|
+
self.logger.warning(f"""
|
|
186
|
+
✅ ════════════════════ USING CACHE ════════════════════
|
|
187
|
+
📦 {self.name} cache: Using cached values
|
|
188
|
+
⏱️ Lag = {age}""")
|
|
189
|
+
return self.cache
|
|
190
|
+
|
|
191
|
+
@staticmethod
|
|
192
|
+
def as_decorator(expire: timedelta, logger: LoggerTemplate, name: Optional[str] = None):
|
|
193
|
+
def decorator(source_func: Callable[[], T2]) -> CacheMemory["T2"]:
|
|
194
|
+
res = CacheMemory(source_func=source_func, expire=expire, logger=logger, name=name)
|
|
195
|
+
return res
|
|
196
|
+
return decorator
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class Cache[T](): # This class helps to accelrate access to latest data coming from expensive function. The class has two flavours, memory-based and disk-based variants."""
|
|
163
200
|
def __init__(
|
|
164
|
-
self, source_func: Callable[[], T], expire: timedelta, logger:
|
|
201
|
+
self, source_func: Callable[[], T], expire: timedelta, logger: LoggerTemplate, path: Path, saver: Callable[[T, Path], Any] = to_pickle, reader: Callable[[Path], T] = from_pickle, name: Optional[str] = None
|
|
165
202
|
) -> None:
|
|
166
203
|
self.cache: T
|
|
167
204
|
self.source_func = source_func # function which when called returns a fresh object to be frozen.
|
|
168
|
-
self.path:
|
|
205
|
+
self.path: Path = path
|
|
206
|
+
_ = self.path.parent.mkdir(parents=True, exist_ok=True)
|
|
169
207
|
self.time_produced = datetime.now() # if path is None else
|
|
170
208
|
self.save = saver
|
|
171
209
|
self.reader = reader
|
|
172
210
|
self.logger = logger
|
|
173
211
|
self.expire = expire
|
|
174
|
-
self.name = name if isinstance(name, str) else
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
def age(self):
|
|
179
|
-
"""Throws AttributeError if called before cache is populated and path doesn't exists"""
|
|
180
|
-
if self.path is None: # memory-based cache.
|
|
181
|
-
return datetime.now() - self.time_produced
|
|
182
|
-
return datetime.now() - datetime.fromtimestamp(self.path.stat().st_mtime)
|
|
183
|
-
|
|
184
|
-
# def __setstate__(self, state: dict[str, Any]) -> None:
|
|
185
|
-
# self.__dict__.update(state)
|
|
186
|
-
# self.path = P.home() / self.path if self.path is not None else self.path
|
|
187
|
-
# def __getstate__(self) -> dict[str, Any]:
|
|
188
|
-
# state = self.__dict__.copy()
|
|
189
|
-
# state["path"] = self.path.rel2home() if self.path is not None else state["path"]
|
|
190
|
-
# return state # With this implementation, instances can be pickled and loaded up in different machine and still works.
|
|
191
|
-
def __call__(self, fresh: bool = False) -> T:
|
|
192
|
-
self.last_call_is_fresh = False
|
|
193
|
-
if fresh or not hasattr(self, "cache"): # populate cache for the first time
|
|
194
|
-
if not fresh and self.path is not None and self.path.exists():
|
|
212
|
+
self.name = name if isinstance(name, str) else self.source_func.__name__
|
|
213
|
+
def __call__(self, fresh: bool, tolerance_seconds: float | int) -> T:
|
|
214
|
+
if not hasattr(self, "cache"): # populate cache for the first time: we have two options, populate from disk or from source func.
|
|
215
|
+
if self.path.exists(): # prefer to read from disk over source func as a default source of cache.
|
|
195
216
|
age = datetime.now() - datetime.fromtimestamp(self.path.stat().st_mtime)
|
|
217
|
+
if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)): # cache is old or if fresh flag is raised
|
|
218
|
+
self.logger.warning(f"""
|
|
219
|
+
🔄 ════════════════════ CACHE STALE ════════════════════
|
|
220
|
+
📦 {self.name} cache: Populating fresh cache from source func
|
|
221
|
+
⏱️ Lag = {age}""")
|
|
222
|
+
t0 = time.time()
|
|
223
|
+
self.cache = self.source_func() # fresh data.
|
|
224
|
+
self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
|
|
225
|
+
self.time_produced = datetime.now()
|
|
226
|
+
self.save(self.cache, self.path)
|
|
227
|
+
return self.cache
|
|
228
|
+
|
|
196
229
|
msg1 = f"""
|
|
197
230
|
📦 ════════════════════ CACHE OPERATION ════════════════════
|
|
198
231
|
🔄 {self.name} cache: Reading cached values from `{self.path}`
|
|
199
|
-
⏱️ Lag = {age}
|
|
200
|
-
════════════════════════════════════════════════════════════
|
|
201
|
-
"""
|
|
232
|
+
⏱️ Lag = {age}"""
|
|
202
233
|
try:
|
|
203
234
|
self.cache = self.reader(self.path)
|
|
204
235
|
except Exception as ex:
|
|
205
|
-
|
|
206
|
-
msg2 = f"""
|
|
236
|
+
msg2 = f"""
|
|
207
237
|
❌ ════════════════════ CACHE ERROR ════════════════════
|
|
208
238
|
⚠️ {self.name} cache: Cache file is corrupted
|
|
209
|
-
🔍 Error: {ex}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
self.logger(msg1 + msg2)
|
|
239
|
+
🔍 Error: {ex}"""
|
|
240
|
+
self.logger.warning(msg1 + msg2)
|
|
241
|
+
t0 = time.time()
|
|
213
242
|
self.cache = self.source_func()
|
|
214
|
-
self.
|
|
243
|
+
self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
|
|
215
244
|
self.time_produced = datetime.now()
|
|
216
|
-
|
|
217
|
-
# self.save(self.cache, self.path)
|
|
245
|
+
self.save(self.cache, self.path)
|
|
218
246
|
return self.cache
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
# Previous cache never existed or there was an explicit fresh order.
|
|
223
|
-
why = "There was an explicit fresh order." if fresh else "Previous cache never existed or is corrupted."
|
|
224
|
-
self.logger(f"""
|
|
247
|
+
else: # disk cache does not exist, populate from source func.
|
|
248
|
+
why = "Previous cache never existed."
|
|
249
|
+
self.logger.warning(f"""
|
|
225
250
|
🆕 ════════════════════ NEW CACHE ════════════════════
|
|
226
251
|
🔄 {self.name} cache: Populating fresh cache from source func
|
|
227
|
-
ℹ️ Reason: {why}
|
|
228
|
-
|
|
229
|
-
""")
|
|
252
|
+
ℹ️ Reason: {why}""")
|
|
253
|
+
t0 = time.time()
|
|
230
254
|
self.cache = self.source_func() # fresh data.
|
|
231
|
-
self.
|
|
255
|
+
self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
|
|
232
256
|
self.time_produced = datetime.now()
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
except AttributeError: # path doesn't exist (may be deleted) ==> need to repopulate cache form source_func.
|
|
239
|
-
return self(fresh=True)
|
|
240
|
-
if age > self.expire:
|
|
241
|
-
if self.logger:
|
|
242
|
-
self.logger(f"""
|
|
257
|
+
self.save(self.cache, self.path)
|
|
258
|
+
else: # memory cache exists
|
|
259
|
+
age = datetime.now() - self.time_produced
|
|
260
|
+
if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)): # cache is old or if fresh flag is raised
|
|
261
|
+
self.logger.warning(f"""
|
|
243
262
|
🔄 ════════════════════ CACHE UPDATE ════════════════════
|
|
244
263
|
⚠️ {self.name} cache: Updating cache from source func
|
|
245
|
-
⏱️ Age = {age} > {self.expire}
|
|
246
|
-
|
|
264
|
+
⏱️ Age = {age} > {self.expire}""")
|
|
265
|
+
t0 = time.time()
|
|
247
266
|
self.cache = self.source_func()
|
|
248
|
-
self.
|
|
267
|
+
self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
|
|
249
268
|
self.time_produced = datetime.now()
|
|
250
|
-
|
|
251
|
-
self.save(self.cache, self.path)
|
|
269
|
+
self.save(self.cache, self.path)
|
|
252
270
|
else:
|
|
253
|
-
|
|
254
|
-
self.logger(f"""
|
|
271
|
+
self.logger.warning(f"""
|
|
255
272
|
✅ ════════════════════ USING CACHE ════════════════════
|
|
256
273
|
📦 {self.name} cache: Using cached values
|
|
257
|
-
⏱️ Lag = {age}
|
|
258
|
-
════════════════════════════════════════════════════════""")
|
|
274
|
+
⏱️ Lag = {age}""")
|
|
259
275
|
return self.cache
|
|
260
276
|
|
|
261
277
|
@staticmethod
|
|
262
278
|
def as_decorator(
|
|
263
|
-
expire: timedelta, logger:
|
|
279
|
+
expire: timedelta, logger: LoggerTemplate, path: Path, saver: Callable[[T2, Path], Any] = to_pickle, reader: Callable[[Path], T2] = from_pickle, name: Optional[str] = None
|
|
264
280
|
): # -> Callable[..., 'Cache[T2]']:
|
|
265
281
|
def decorator(source_func: Callable[[], T2]) -> Cache["T2"]:
|
|
266
282
|
res = Cache(source_func=source_func, expire=expire, logger=logger, path=path, name=name, reader=reader, saver=saver)
|
|
267
283
|
return res
|
|
268
|
-
|
|
269
284
|
return decorator
|
|
270
|
-
|
|
271
|
-
def from_cloud(self, cloud: str, rel2home: bool = True, root: Optional[str] = None):
|
|
272
|
-
assert self.path is not None
|
|
273
|
-
exists = self.path.exists()
|
|
274
|
-
exists_but_old = exists and ((datetime.now() - datetime.fromtimestamp(self.path.stat().st_mtime)) > self.expire)
|
|
275
|
-
if not exists or exists_but_old:
|
|
276
|
-
returned_path = self.path.from_cloud(cloud=cloud, rel2home=rel2home, root=root)
|
|
277
|
-
if returned_path is None and not exists:
|
|
278
|
-
raise FileNotFoundError(f"❌ Failed to get @ {self.path}. Build the cache first with signed API.")
|
|
279
|
-
elif returned_path is None and exists and self.logger is not None:
|
|
280
|
-
self.logger(f"""
|
|
281
|
-
⚠️ ════════════════════ CLOUD FETCH WARNING ════════════════════
|
|
282
|
-
🔄 Failed to get fresh data from cloud
|
|
283
|
-
📦 Using old cache @ {self.path}
|
|
284
|
-
════════════════════════════════════════════════════════════════""")
|
|
285
|
-
else:
|
|
286
|
-
pass # maybe we don't need to fetch it from cloud, if its too hot
|
|
287
|
-
return self.reader(self.path)
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# """Task scheduler
|
|
2
2
|
# """
|
|
3
3
|
|
|
4
|
-
# from machineconfig.utils.utils import get_shell_script_executing_python_file
|
|
5
4
|
# from machineconfig.utils.utils2 import read_ini
|
|
6
5
|
# from dataclasses import dataclass
|
|
7
6
|
# from datetime import datetime, timedelta
|
|
@@ -140,8 +139,6 @@
|
|
|
140
139
|
# start: datetime
|
|
141
140
|
# end: datetime
|
|
142
141
|
# status: str
|
|
143
|
-
|
|
144
|
-
# @classmethod
|
|
145
142
|
# def from_path(cls, path: PathExtended, return_default_if_not_found: bool=False):
|
|
146
143
|
# if not path.exists():
|
|
147
144
|
# if return_default_if_not_found:
|
|
@@ -6,8 +6,7 @@ capturing all user inputs collected during interactive execution.
|
|
|
6
6
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
from typing import TypedDict, Literal, NotRequired
|
|
9
|
-
from machineconfig.scripts.python.
|
|
10
|
-
from machineconfig.scripts.python.fire_agents_help_launch import AGENTS
|
|
9
|
+
from machineconfig.scripts.python.helpers_agents.fire_agents_help_launch import AGENTS
|
|
11
10
|
|
|
12
11
|
SEARCH_STRATEGIES = Literal["file_path", "keyword_search", "filename_pattern"]
|
|
13
12
|
|
|
@@ -21,26 +20,17 @@ class FilePathSearchInput(TypedDict):
|
|
|
21
20
|
|
|
22
21
|
class KeywordSearchInput(TypedDict):
|
|
23
22
|
"""Input for keyword_search strategy."""
|
|
24
|
-
|
|
25
23
|
keyword: str
|
|
26
24
|
|
|
27
25
|
|
|
28
26
|
class FilenamePatternSearchInput(TypedDict):
|
|
29
27
|
"""Input for filename_pattern search strategy."""
|
|
30
|
-
|
|
31
28
|
pattern: str # e.g., '*.py', '*test*', 'config.*'
|
|
32
29
|
|
|
33
30
|
|
|
34
|
-
class
|
|
35
|
-
"""Input for
|
|
36
|
-
|
|
37
|
-
agent_cap: int # Default: 6
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class TaskRowsSplittingInput(TypedDict):
|
|
41
|
-
"""Input for task_rows splitting strategy."""
|
|
42
|
-
|
|
43
|
-
task_rows: int # Default: 13
|
|
31
|
+
class TasksPerPromptSplittingInput(TypedDict):
|
|
32
|
+
"""Input for tasks_per_prompt splitting strategy."""
|
|
33
|
+
tasks_per_prompt: int # Default: 13
|
|
44
34
|
|
|
45
35
|
|
|
46
36
|
class FireAgentsMainInput(TypedDict):
|
|
@@ -49,7 +39,6 @@ class FireAgentsMainInput(TypedDict):
|
|
|
49
39
|
# Core configuration
|
|
50
40
|
repo_root: Path
|
|
51
41
|
search_strategy: SEARCH_STRATEGIES
|
|
52
|
-
splitting_strategy: SPLITTING_STRATEGY
|
|
53
42
|
agent_selected: AGENTS
|
|
54
43
|
prompt_prefix: str
|
|
55
44
|
job_name: str # Default: "AI_Agents"
|
|
@@ -62,8 +51,7 @@ class FireAgentsMainInput(TypedDict):
|
|
|
62
51
|
filename_pattern_input: NotRequired[FilenamePatternSearchInput]
|
|
63
52
|
|
|
64
53
|
# Splitting strategy specific inputs (only one will be present based on splitting_strategy)
|
|
65
|
-
|
|
66
|
-
task_rows_input: NotRequired[TaskRowsSplittingInput]
|
|
54
|
+
tasks_per_prompt: TasksPerPromptSplittingInput
|
|
67
55
|
|
|
68
56
|
|
|
69
57
|
class FireAgentsRuntimeData(TypedDict):
|
|
@@ -1,20 +1,42 @@
|
|
|
1
|
-
from typing import TypedDict, Literal, TypeAlias
|
|
1
|
+
from typing import TypedDict, Literal, TypeAlias, Optional
|
|
2
|
+
import platform
|
|
2
3
|
|
|
3
4
|
|
|
4
|
-
APP_INSTALLER_CATEGORY: TypeAlias = Literal["OS_SPECIFIC", "OS_GENERIC", "CUSTOM", "OS_SPECIFIC_DEV", "OS_GENERIC_DEV", "CUSTOM_DEV"]
|
|
5
5
|
CPU_ARCHITECTURES: TypeAlias = Literal["amd64", "arm64"]
|
|
6
6
|
OPERATING_SYSTEMS: TypeAlias = Literal["windows", "linux", "macos"]
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class InstallerData(TypedDict):
|
|
10
10
|
appName: str
|
|
11
|
-
repoURL: str
|
|
12
11
|
doc: str
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
exeName: str
|
|
12
|
+
repoURL: str
|
|
13
|
+
fileNamePattern: dict[CPU_ARCHITECTURES, dict[OPERATING_SYSTEMS, Optional[str]]]
|
|
16
14
|
|
|
17
15
|
|
|
18
16
|
class InstallerDataFiles(TypedDict):
|
|
19
17
|
version: str
|
|
20
18
|
installers: list[InstallerData]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_os_name() -> OPERATING_SYSTEMS:
|
|
22
|
+
"""Get the operating system name in the format expected by the github parser."""
|
|
23
|
+
sys_name = platform.system()
|
|
24
|
+
if sys_name == "Windows":
|
|
25
|
+
return "windows"
|
|
26
|
+
elif sys_name == "Linux":
|
|
27
|
+
return "linux"
|
|
28
|
+
elif sys_name == "Darwin":
|
|
29
|
+
return "macos"
|
|
30
|
+
else:
|
|
31
|
+
raise NotImplementedError(f"System {sys_name} not supported")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def get_normalized_arch() -> CPU_ARCHITECTURES:
|
|
35
|
+
"""Get the normalized CPU architecture."""
|
|
36
|
+
arch_raw = platform.machine().lower()
|
|
37
|
+
if arch_raw in ("x86_64", "amd64"):
|
|
38
|
+
return "amd64"
|
|
39
|
+
if arch_raw in ("aarch64", "arm64", "armv8", "armv8l"):
|
|
40
|
+
return "arm64"
|
|
41
|
+
# Default to amd64 if unknown architecture
|
|
42
|
+
return "amd64"
|