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,175 +0,0 @@
|
|
|
1
|
-
"""Utility to launch multiple AI agent prompts in a Zellij session.
|
|
2
|
-
|
|
3
|
-
Improved design notes:
|
|
4
|
-
* Clear separation of: input collection, prompt preparation, agent launch.
|
|
5
|
-
* Configurable max agent cap (default 15) with interactive confirmation if exceeded.
|
|
6
|
-
* Added type aliases + docstrings for maintainability.
|
|
7
|
-
* Preserves original core behavior & command generation for each agent type.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
from typing import cast, get_args, Iterable, TypeAlias, Literal
|
|
12
|
-
import json
|
|
13
|
-
import sys
|
|
14
|
-
|
|
15
|
-
from machineconfig.scripts.python.fire_agents_help_launch import prep_agent_launch, get_agents_launch_layout, AGENTS
|
|
16
|
-
from machineconfig.scripts.python.fire_agents_help_search import search_files_by_pattern, search_python_files
|
|
17
|
-
from machineconfig.scripts.python.fire_agents_load_balancer import chunk_prompts, SPLITTING_STRATEGY, DEFAULT_AGENT_CAP
|
|
18
|
-
from machineconfig.utils.options import choose_from_options
|
|
19
|
-
from machineconfig.utils.schemas.layouts.layout_types import TabConfig, LayoutConfig
|
|
20
|
-
from machineconfig.utils.accessories import get_repo_root
|
|
21
|
-
|
|
22
|
-
SEARCH_STRATEGIES: TypeAlias = Literal["file_path", "keyword_search", "filename_pattern"]
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def _write_list_file(target: Path, files: Iterable[Path]) -> None:
|
|
26
|
-
target.parent.mkdir(parents=True, exist_ok=True)
|
|
27
|
-
target.write_text("\n".join(str(f) for f in files), encoding="utf-8")
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def get_prompt_material(search_strategy: SEARCH_STRATEGIES, repo_root: Path) -> tuple[Path, str]:
|
|
31
|
-
if search_strategy == "file_path":
|
|
32
|
-
file_path_input = input("Enter path to target file: ").strip()
|
|
33
|
-
if not file_path_input:
|
|
34
|
-
print("No file path provided. Exiting.")
|
|
35
|
-
sys.exit(1)
|
|
36
|
-
target_file_path = Path(file_path_input).expanduser().resolve()
|
|
37
|
-
if not target_file_path.exists() or not target_file_path.is_file():
|
|
38
|
-
print(f"Invalid file path: {target_file_path}")
|
|
39
|
-
sys.exit(1)
|
|
40
|
-
separator = input("Enter separator [\\n]: ").strip() or "\n"
|
|
41
|
-
elif search_strategy == "keyword_search":
|
|
42
|
-
keyword = input("Enter keyword to search recursively for all .py files containing it: ").strip()
|
|
43
|
-
if not keyword:
|
|
44
|
-
print("No keyword supplied. Exiting.")
|
|
45
|
-
sys.exit(1)
|
|
46
|
-
matching_files = search_python_files(repo_root, keyword)
|
|
47
|
-
if not matching_files:
|
|
48
|
-
print(f"💥 No .py files found containing keyword: {keyword}")
|
|
49
|
-
sys.exit(1)
|
|
50
|
-
for idx, mf in enumerate(matching_files):
|
|
51
|
-
print(f"{idx:>3}: {mf}")
|
|
52
|
-
print(f"\nFound {len(matching_files)} .py files containing keyword: {keyword}")
|
|
53
|
-
target_file_path = repo_root / ".ai" / "target_file.txt"
|
|
54
|
-
_write_list_file(target_file_path, matching_files)
|
|
55
|
-
separator = "\n"
|
|
56
|
-
elif search_strategy == "filename_pattern":
|
|
57
|
-
pattern = input("Enter filename pattern (e.g., '*.py', '*test*', 'config.*'): ").strip()
|
|
58
|
-
if not pattern:
|
|
59
|
-
print("No pattern supplied. Exiting.")
|
|
60
|
-
sys.exit(1)
|
|
61
|
-
matching_files = search_files_by_pattern(repo_root, pattern)
|
|
62
|
-
if not matching_files:
|
|
63
|
-
print(f"💥 No files found matching pattern: {pattern}")
|
|
64
|
-
sys.exit(1)
|
|
65
|
-
for idx, mf in enumerate(matching_files):
|
|
66
|
-
print(f"{idx:>3}: {mf}")
|
|
67
|
-
print(f"\nFound {len(matching_files)} files matching pattern: {pattern}")
|
|
68
|
-
target_file_path = repo_root / ".ai" / "target_file.txt"
|
|
69
|
-
_write_list_file(target_file_path, matching_files)
|
|
70
|
-
separator = "\n"
|
|
71
|
-
else:
|
|
72
|
-
raise ValueError(f"Unknown search strategy: {search_strategy}")
|
|
73
|
-
return target_file_path, separator
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def main(): # noqa: C901 - (complexity acceptable for CLI glue)
|
|
77
|
-
repo_root = get_repo_root(Path.cwd())
|
|
78
|
-
if repo_root is None:
|
|
79
|
-
print("💥 Could not determine the repository root. Please run this script from within a git repository.")
|
|
80
|
-
sys.exit(1)
|
|
81
|
-
print(f"Operating @ {repo_root}")
|
|
82
|
-
|
|
83
|
-
search_strategy = cast(SEARCH_STRATEGIES, choose_from_options(multi=False, msg="Choose one option", header="Choose search strategy:", options=get_args(SEARCH_STRATEGIES)))
|
|
84
|
-
splitting_strategy = cast(SPLITTING_STRATEGY, choose_from_options(multi=False, msg="Choose one option", header="Choose prompt splitting strategy:", options=get_args(SPLITTING_STRATEGY)))
|
|
85
|
-
agent_selected = cast(AGENTS, choose_from_options(multi=False, msg="Choose one option", header="Select agent type", options=get_args(AGENTS)))
|
|
86
|
-
print("Enter prefix prompt (end with Ctrl-D / Ctrl-Z):")
|
|
87
|
-
prompt_prefix = "\n".join(sys.stdin.readlines())
|
|
88
|
-
job_name = input("Enter job name [AI_AGENTS]: ") or "AI_Agents"
|
|
89
|
-
keep_material_in_separate_file_input = input("Keep prompt material in separate file? [y/N]: ").strip().lower() == "y"
|
|
90
|
-
|
|
91
|
-
prompt_material_path, separator = get_prompt_material(search_strategy=search_strategy, repo_root=repo_root)
|
|
92
|
-
match splitting_strategy:
|
|
93
|
-
case "agent_cap":
|
|
94
|
-
agent_cap_input = input(f"Enter maximum number of agents/splits [default: {DEFAULT_AGENT_CAP}]: ").strip()
|
|
95
|
-
agent_cap = int(agent_cap_input) if agent_cap_input else DEFAULT_AGENT_CAP
|
|
96
|
-
task_rows = None
|
|
97
|
-
case "task_rows":
|
|
98
|
-
task_rows_input: str = input("Enter number of rows/tasks per agent [13]: ").strip() or "13"
|
|
99
|
-
task_rows = int(task_rows_input)
|
|
100
|
-
agent_cap = None
|
|
101
|
-
prompt_material_re_splitted = chunk_prompts(prompt_material_path, splitting_strategy, agent_cap=agent_cap, task_rows=task_rows, joiner=separator)
|
|
102
|
-
|
|
103
|
-
agents_dir = prep_agent_launch(repo_root=repo_root, prompts_material=prompt_material_re_splitted, keep_material_in_separate_file=keep_material_in_separate_file_input, prompt_prefix=prompt_prefix, agent=agent_selected, job_name=job_name)
|
|
104
|
-
layoutfile = get_agents_launch_layout(session_root=agents_dir)
|
|
105
|
-
|
|
106
|
-
regenerate_py_code = f"""
|
|
107
|
-
#!/usr/bin/env uv run --python 3.13 --with machineconfig
|
|
108
|
-
#!/usr/bin/env uv run --no-dev --project $HOME/code/machineconfig
|
|
109
|
-
|
|
110
|
-
from machineconfig.scripts.python.fire_agents import *
|
|
111
|
-
|
|
112
|
-
repo_root = Path("{repo_root}")
|
|
113
|
-
search_strategy = "{search_strategy}"
|
|
114
|
-
splitting_strategy = "{splitting_strategy}"
|
|
115
|
-
agent_selected = "{agent_selected}"
|
|
116
|
-
prompt_prefix = '''{prompt_prefix}'''
|
|
117
|
-
job_name = "{job_name}"
|
|
118
|
-
keep_material_in_separate_file_input = {keep_material_in_separate_file_input}
|
|
119
|
-
separator = "{separator}"
|
|
120
|
-
prompt_material_path = Path("{prompt_material_path}")
|
|
121
|
-
agent_cap = {agent_cap}
|
|
122
|
-
task_rows = {task_rows}
|
|
123
|
-
|
|
124
|
-
prompt_material_re_splitted = chunk_prompts(prompt_material_path, splitting_strategy, agent_cap=agent_cap, task_rows=task_rows, joiner=separator)
|
|
125
|
-
agents_dir = prep_agent_launch(repo_root=repo_root, prompts_material=prompt_material_re_splitted, keep_material_in_separate_file=keep_material_in_separate_file_input, prompt_prefix=prompt_prefix, agent=agent_selected, job_name=job_name)
|
|
126
|
-
layout = get_agents_launch_layout(session_root=agents_dir)
|
|
127
|
-
|
|
128
|
-
(agents_dir / "aa_agents_relaunch.py").write_text(data=regenerate_py_code, encoding="utf-8")
|
|
129
|
-
(agents_dir / "layout.json").write_text(data=json.dumps(layout, indent=2), encoding="utf-8")
|
|
130
|
-
|
|
131
|
-
if len(layout["layoutTabs"]) > 25:
|
|
132
|
-
print("Too many agents (>25) to launch. Skipping launch.")
|
|
133
|
-
sys.exit(0)
|
|
134
|
-
manager = ZellijLocalManager(session_layouts=[layout])
|
|
135
|
-
manager.start_all_sessions()
|
|
136
|
-
manager.run_monitoring_routine()
|
|
137
|
-
|
|
138
|
-
"""
|
|
139
|
-
(agents_dir / "aa_agents_relaunch.py").write_text(data=regenerate_py_code, encoding="utf-8")
|
|
140
|
-
(agents_dir / "layout.json").write_text(data=json.dumps(layoutfile, indent=2), encoding="utf-8")
|
|
141
|
-
|
|
142
|
-
MAX_TABS = 10
|
|
143
|
-
if len(layoutfile["layouts"][0]["layoutTabs"]) > MAX_TABS:
|
|
144
|
-
print(f"Too many tabs (>{MAX_TABS}) to launch. Skipping launch.")
|
|
145
|
-
sys.exit(0)
|
|
146
|
-
from machineconfig.cluster.sessions_managers.zellij_local_manager import ZellijLocalManager
|
|
147
|
-
|
|
148
|
-
manager = ZellijLocalManager(session_layouts=layoutfile["layouts"])
|
|
149
|
-
manager.start_all_sessions(poll_interval=2, poll_seconds=2)
|
|
150
|
-
manager.run_monitoring_routine(wait_ms=2000)
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
def split_too_many_tabs_to_run_in_sequential_sessions(layout_tabs: list[TabConfig], every: int):
|
|
154
|
-
from machineconfig.utils.accessories import split_list
|
|
155
|
-
from machineconfig.cluster.sessions_managers.zellij_local_manager import ZellijLocalManager
|
|
156
|
-
|
|
157
|
-
for idx, layout_tabs_chunk in enumerate(split_list(layout_tabs, every=every, to=None)):
|
|
158
|
-
a_layout_file: LayoutConfig = {"layoutName": f"split_{idx}", "layoutTabs": layout_tabs_chunk}
|
|
159
|
-
manager = ZellijLocalManager(session_layouts=[a_layout_file])
|
|
160
|
-
manager.start_all_sessions(poll_interval=2, poll_seconds=2)
|
|
161
|
-
manager.run_monitoring_routine(wait_ms=2000)
|
|
162
|
-
manager.kill_all_sessions()
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
def split_too_many_layouts_to_run_in_sequential_sessions(layouts: list[LayoutConfig], every: int):
|
|
166
|
-
from machineconfig.utils.accessories import split_list
|
|
167
|
-
from machineconfig.cluster.sessions_managers.zellij_local_manager import ZellijLocalManager
|
|
168
|
-
for _idx, layout_chunk in enumerate(split_list(layouts, every=every)):
|
|
169
|
-
manager = ZellijLocalManager(session_layouts=layout_chunk)
|
|
170
|
-
manager.start_all_sessions(poll_interval=2, poll_seconds=2)
|
|
171
|
-
manager.run_monitoring_routine(wait_ms=2000)
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
if __name__ == "__main__": # pragma: no cover
|
|
175
|
-
main()
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
from machineconfig.utils.accessories import randstr
|
|
2
|
-
|
|
3
|
-
import random
|
|
4
|
-
import shlex
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
from typing import Literal, TypeAlias
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
AGENTS: TypeAlias = Literal[
|
|
10
|
-
"cursor-agent", "gemini", "crush", "q", "onlyPrepPromptFiles"
|
|
11
|
-
# warp terminal
|
|
12
|
-
]
|
|
13
|
-
AGENT_NAME_FORMATTER = "agent_{idx}_cmd.sh" # e.g., agent_0_cmd.sh
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def get_gemini_api_keys() -> list[str]:
|
|
17
|
-
from machineconfig.utils.io import read_ini
|
|
18
|
-
|
|
19
|
-
config = read_ini(Path.home().joinpath("dotfiles/creds/llm/gemini/api_keys.ini"))
|
|
20
|
-
res: list[str] = []
|
|
21
|
-
for a_section_name in list(config.sections()):
|
|
22
|
-
a_section = config[a_section_name]
|
|
23
|
-
if "api_key" in a_section:
|
|
24
|
-
api_key = a_section["api_key"].strip()
|
|
25
|
-
if api_key:
|
|
26
|
-
res.append(api_key)
|
|
27
|
-
print(f"Found {len(res)} Gemini API keys configured.")
|
|
28
|
-
return res
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def prep_agent_launch(repo_root: Path, prompts_material: list[str], prompt_prefix: str, keep_material_in_separate_file: bool, agent: AGENTS, *, job_name: str) -> Path:
|
|
32
|
-
session_root = repo_root / ".ai" / f"tmp_prompts/{job_name}_{randstr()}"
|
|
33
|
-
session_root.mkdir(parents=True, exist_ok=True)
|
|
34
|
-
prompt_folder = session_root / "prompts"
|
|
35
|
-
prompt_folder.mkdir(parents=True, exist_ok=True)
|
|
36
|
-
|
|
37
|
-
all_materials_scripts: list[Path] = []
|
|
38
|
-
for idx, a_prompt_material in enumerate(prompts_material):
|
|
39
|
-
prompt_root = prompt_folder / f"agent_{idx}"
|
|
40
|
-
prompt_root.mkdir(parents=True, exist_ok=True)
|
|
41
|
-
prompt_path = prompt_root / f"agent_{idx}_prompt.txt"
|
|
42
|
-
if keep_material_in_separate_file:
|
|
43
|
-
prompt_material_path = prompt_root / f"agent_{idx}_material.txt"
|
|
44
|
-
prompt_material_path.write_text(a_prompt_material, encoding="utf-8")
|
|
45
|
-
prompt_path.write_text(prompt_prefix + f"""\nPlease only look @ {prompt_material_path}. You don't need to do any other work beside the content of this material file.""", encoding="utf-8")
|
|
46
|
-
all_materials_scripts.append(prompt_material_path)
|
|
47
|
-
else:
|
|
48
|
-
prompt_material_path = prompt_path
|
|
49
|
-
prompt_path.write_text(prompt_prefix + """\nPlease only look @ the following:\n""" + a_prompt_material, encoding="utf-8")
|
|
50
|
-
|
|
51
|
-
agent_cmd_launch_path = prompt_root / AGENT_NAME_FORMATTER.format(idx=idx) # e.g., agent_0_cmd.sh
|
|
52
|
-
random_sleep_time = random.uniform(0, 5)
|
|
53
|
-
cmd_prefix = f"""
|
|
54
|
-
#!/usr/bin/env bash
|
|
55
|
-
|
|
56
|
-
# AGENT-{idx}-LAUNCH-SCRIPT
|
|
57
|
-
# Auto-generated by fire_agents.py
|
|
58
|
-
|
|
59
|
-
export FIRE_AGENTS_AGENT_NAME="{agent}"
|
|
60
|
-
export FIRE_AGENTS_JOB_NAME="{job_name}"
|
|
61
|
-
export FIRE_AGENTS_PROMPT_FILE="{prompt_path}"
|
|
62
|
-
export FIRE_AGENTS_MATERIAL_FILE="{prompt_material_path}"
|
|
63
|
-
export FIRE_AGENTS_AGENT_LAUNCHER="{agent_cmd_launch_path}"
|
|
64
|
-
|
|
65
|
-
echo "Sleeping for {random_sleep_time:.2f} seconds to stagger agent startups..."
|
|
66
|
-
sleep {random_sleep_time:.2f}
|
|
67
|
-
echo "Launching agent {agent} with prompt from {prompt_path}"
|
|
68
|
-
echo "Launching agent {agent} with command from {agent_cmd_launch_path}"
|
|
69
|
-
echo "--------START OF AGENT OUTPUT--------"
|
|
70
|
-
sleep 0.1
|
|
71
|
-
|
|
72
|
-
"""
|
|
73
|
-
match agent:
|
|
74
|
-
case "gemini":
|
|
75
|
-
model = "gemini-2.5-pro"
|
|
76
|
-
# model = "gemini-2.5-flash-lite"
|
|
77
|
-
# model = None # auto-select
|
|
78
|
-
# if model is None:
|
|
79
|
-
# model_arg = ""
|
|
80
|
-
# else:
|
|
81
|
-
model_arg = f"--model {shlex.quote(model)}"
|
|
82
|
-
# Need a real shell for the pipeline; otherwise '| gemini ...' is passed as args to 'cat'
|
|
83
|
-
safe_path = shlex.quote(str(prompt_path))
|
|
84
|
-
api_keys = get_gemini_api_keys()
|
|
85
|
-
api_key = api_keys[idx % len(api_keys)] if api_keys else ""
|
|
86
|
-
# Export the environment variable so it's available to subshells
|
|
87
|
-
cmd = f"""
|
|
88
|
-
export GEMINI_API_KEY={shlex.quote(api_key)}
|
|
89
|
-
echo "Using Gemini API key $GEMINI_API_KEY"
|
|
90
|
-
bash -lc 'cat {safe_path} | gemini {model_arg} --yolo --prompt'
|
|
91
|
-
"""
|
|
92
|
-
case "cursor-agent":
|
|
93
|
-
# As originally implemented
|
|
94
|
-
cmd = f"""
|
|
95
|
-
|
|
96
|
-
cursor-agent --print --output-format text < {prompt_path}
|
|
97
|
-
|
|
98
|
-
"""
|
|
99
|
-
case "crush":
|
|
100
|
-
cmd = f"""
|
|
101
|
-
crush run {prompt_path}
|
|
102
|
-
"""
|
|
103
|
-
case "q":
|
|
104
|
-
cmd = f"""
|
|
105
|
-
q chat --no-interactive --trust-all-tools {prompt_path}
|
|
106
|
-
"""
|
|
107
|
-
case "onlyPrepPromptFiles":
|
|
108
|
-
cmd = f"""
|
|
109
|
-
echo "Prepared prompt file at {prompt_path}"
|
|
110
|
-
"""
|
|
111
|
-
case _:
|
|
112
|
-
raise ValueError(f"Unsupported agent type: {agent}")
|
|
113
|
-
cmd_postfix = """
|
|
114
|
-
sleep 0.1
|
|
115
|
-
echo "---------END OF AGENT OUTPUT---------"
|
|
116
|
-
"""
|
|
117
|
-
agent_cmd_launch_path.write_text(cmd_prefix + cmd + cmd_postfix, encoding="utf-8")
|
|
118
|
-
|
|
119
|
-
# print(f"Launching a template with #{len(tab_config)} agents")
|
|
120
|
-
if len(all_materials_scripts) > 0:
|
|
121
|
-
all_materials_list_path = session_root / "all_materials_redistributed.txt"
|
|
122
|
-
all_materials_list_path.write_text("\n".join(str(p) for p in all_materials_scripts), encoding="utf-8")
|
|
123
|
-
print(f"All prompt materials listed @ {all_materials_list_path}")
|
|
124
|
-
return session_root
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
def get_agents_launch_layout(session_root: Path):
|
|
128
|
-
from machineconfig.utils.schemas.layouts.layout_types import TabConfig, LayoutConfig, LayoutsFile
|
|
129
|
-
|
|
130
|
-
tab_config: list[TabConfig] = []
|
|
131
|
-
prompt_root = session_root / "prompts"
|
|
132
|
-
all_dirs_under_prompts = [d for d in prompt_root.iterdir() if d.is_dir()]
|
|
133
|
-
launch_agents_squentially = ""
|
|
134
|
-
for a_prompt_dir in all_dirs_under_prompts:
|
|
135
|
-
idx = a_prompt_dir.name.split("_")[-1] # e.g., agent_0 -> 0
|
|
136
|
-
agent_cmd_path = a_prompt_dir / AGENT_NAME_FORMATTER.format(idx=idx)
|
|
137
|
-
fire_cmd = f"bash {shlex.quote(str(agent_cmd_path))}"
|
|
138
|
-
tab_config.append(TabConfig(tabName=f"Agent{idx}", startDir=str(session_root.parent.parent.parent), command=fire_cmd))
|
|
139
|
-
launch_agents_squentially += f". {shlex.quote(str(agent_cmd_path))}\n"
|
|
140
|
-
layout = LayoutConfig(layoutName="Agents", layoutTabs=tab_config)
|
|
141
|
-
(session_root / "launch_all_agents_sequentially.sh").write_text(launch_agents_squentially, encoding="utf-8")
|
|
142
|
-
layouts_file: LayoutsFile = LayoutsFile(version="1.0", layouts=[layout])
|
|
143
|
-
return layouts_file
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
from typing import Literal, TypeAlias
|
|
2
|
-
from math import ceil
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
SPLITTING_STRATEGY: TypeAlias = Literal[
|
|
7
|
-
"agent_cap", # User decides number of agents, rows/tasks determined automatically
|
|
8
|
-
"task_rows", # User decides number of rows/tasks, number of agents determined automatically
|
|
9
|
-
]
|
|
10
|
-
DEFAULT_AGENT_CAP = 6
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def chunk_prompts(prompt_material_path: Path, strategy: SPLITTING_STRATEGY, joiner: str, *, agent_cap: int | None, task_rows: int | None) -> list[str]:
|
|
14
|
-
"""Chunk prompts based on splitting strategy.
|
|
15
|
-
|
|
16
|
-
Args:
|
|
17
|
-
prompts: List of prompts to chunk
|
|
18
|
-
strategy: Either 'agent_cap' or 'task_rows'
|
|
19
|
-
agent_cap: Maximum number of agents (used with 'agent_cap' strategy)
|
|
20
|
-
task_rows: Number of rows/tasks per agent (used with 'task_rows' strategy)
|
|
21
|
-
"""
|
|
22
|
-
prompts = [p for p in prompt_material_path.read_text(encoding="utf-8", errors="ignore").split(joiner) if p.strip() != ""] # drop blank entries
|
|
23
|
-
|
|
24
|
-
if strategy == "agent_cap":
|
|
25
|
-
if agent_cap is None:
|
|
26
|
-
raise ValueError("agent_cap must be provided when using 'agent_cap' strategy")
|
|
27
|
-
|
|
28
|
-
if len(prompts) <= agent_cap:
|
|
29
|
-
return prompts
|
|
30
|
-
|
|
31
|
-
print(f"Chunking {len(prompts)} prompts into groups for up to {agent_cap} agents because it exceeds the cap.")
|
|
32
|
-
chunk_size = ceil(len(prompts) / agent_cap)
|
|
33
|
-
grouped: list[str] = []
|
|
34
|
-
for i in range(0, len(prompts), chunk_size):
|
|
35
|
-
grouped.append(joiner.join(prompts[i : i + chunk_size]))
|
|
36
|
-
return grouped
|
|
37
|
-
|
|
38
|
-
elif strategy == "task_rows":
|
|
39
|
-
if task_rows is None:
|
|
40
|
-
raise ValueError("task_rows must be provided when using 'task_rows' strategy")
|
|
41
|
-
if task_rows >= len(prompts):
|
|
42
|
-
return prompts
|
|
43
|
-
print(f"Chunking {len(prompts)} prompts into groups of {task_rows} rows/tasks each.")
|
|
44
|
-
grouped: list[str] = []
|
|
45
|
-
for i in range(0, len(prompts), task_rows):
|
|
46
|
-
grouped.append(joiner.join(prompts[i : i + task_rows]))
|
|
47
|
-
return grouped
|
|
48
|
-
|
|
49
|
-
else:
|
|
50
|
-
raise ValueError(f"Unknown splitting strategy: {strategy}")
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Optional, Any
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
@dataclass
|
|
6
|
-
class FireJobArgs:
|
|
7
|
-
"""Type-safe dataclass for fire_jobs command line arguments."""
|
|
8
|
-
|
|
9
|
-
path: str = "."
|
|
10
|
-
function: Optional[str] = None
|
|
11
|
-
ve: str = ""
|
|
12
|
-
cmd: bool = False
|
|
13
|
-
interactive: bool = False
|
|
14
|
-
debug: bool = False
|
|
15
|
-
choose_function: bool = False
|
|
16
|
-
loop: bool = False
|
|
17
|
-
jupyter: bool = False
|
|
18
|
-
submit_to_cloud: bool = False
|
|
19
|
-
remote: bool = False
|
|
20
|
-
module: bool = False
|
|
21
|
-
streamlit: bool = False
|
|
22
|
-
environment: str = ""
|
|
23
|
-
holdDirectory: bool = False
|
|
24
|
-
PathExport: bool = False
|
|
25
|
-
git_pull: bool = False
|
|
26
|
-
optimized: bool = False
|
|
27
|
-
Nprocess: int = 1
|
|
28
|
-
zellij_tab: Optional[str] = None
|
|
29
|
-
watch: bool = False
|
|
30
|
-
layout: bool = False
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def extract_kwargs(args: FireJobArgs) -> dict[str, object]:
|
|
34
|
-
"""Extract kwargs from command line using -- separator.
|
|
35
|
-
|
|
36
|
-
Returns empty dict since kwargs are now parsed directly from sys.argv
|
|
37
|
-
using the -- separator pattern in the main function.
|
|
38
|
-
"""
|
|
39
|
-
return {}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def parse_fire_args_from_argv() -> str:
|
|
43
|
-
"""Parse arguments after -- separator for Fire compatibility.
|
|
44
|
-
|
|
45
|
-
Returns:
|
|
46
|
-
String of Fire-compatible arguments to append to command
|
|
47
|
-
"""
|
|
48
|
-
import sys
|
|
49
|
-
|
|
50
|
-
if '--' in sys.argv:
|
|
51
|
-
separator_index = sys.argv.index('--')
|
|
52
|
-
fire_args = sys.argv[separator_index + 1:]
|
|
53
|
-
# Join all Fire arguments - they should already be in Fire format
|
|
54
|
-
return ' '.join(fire_args) if fire_args else ''
|
|
55
|
-
|
|
56
|
-
return ''
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
def parse_fire_args_from_context(ctx: Any) -> str:
|
|
60
|
-
"""Parse Fire arguments from typer context.
|
|
61
|
-
|
|
62
|
-
Args:
|
|
63
|
-
ctx: Typer context containing raw arguments
|
|
64
|
-
|
|
65
|
-
Returns:
|
|
66
|
-
String of Fire-compatible arguments to append to command
|
|
67
|
-
"""
|
|
68
|
-
# Get remaining args that weren't consumed by typer
|
|
69
|
-
if hasattr(ctx, 'args') and ctx.args:
|
|
70
|
-
args = ctx.args
|
|
71
|
-
# Filter out the -- separator if present
|
|
72
|
-
if args and args[0] == '--':
|
|
73
|
-
args = args[1:]
|
|
74
|
-
return ' '.join(args)
|
|
75
|
-
return ''
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig, LayoutsFile
|
|
3
|
-
from typing import Optional, TYPE_CHECKING
|
|
4
|
-
from machineconfig.scripts.python.helpers.helpers4 import search_for_files_of_interest
|
|
5
|
-
from machineconfig.utils.options import choose_from_options
|
|
6
|
-
from machineconfig.utils.path_helper import match_file_name, sanitize_path
|
|
7
|
-
from machineconfig.utils.path_extended import PathExtended as PathExtended
|
|
8
|
-
|
|
9
|
-
if TYPE_CHECKING:
|
|
10
|
-
from machineconfig.scripts.python.fire_jobs_args_helper import FireJobArgs
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def select_layout(layouts_json_file: Path, layouts_name: Optional[list[str]]) -> list[LayoutConfig]:
|
|
14
|
-
import json
|
|
15
|
-
layout_file: LayoutsFile = json.loads(layouts_json_file.read_text(encoding="utf-8"))
|
|
16
|
-
if len(layout_file["layouts"]) == 0:
|
|
17
|
-
raise ValueError(f"No layouts found in {layouts_json_file}")
|
|
18
|
-
if layouts_name is None:
|
|
19
|
-
options = [layout["layoutName"] for layout in layout_file["layouts"]]
|
|
20
|
-
from machineconfig.utils.options import choose_from_options
|
|
21
|
-
layouts_name = choose_from_options(multi=True, options=options, prompt="Choose a layout configuration:", fzf=True, msg="Choose one option")
|
|
22
|
-
print(f"Selected layout(s): {layouts_name}")
|
|
23
|
-
# layout_chosen = next((layout for layout in layout_file["layouts"] if layout["layoutName"] == layouts_name), None)
|
|
24
|
-
# if layout_chosen is None:
|
|
25
|
-
# layout_chosen = next((layout for layout in layout_file["layouts"] if layout["layoutName"].lower() == layouts_name.lower()), None)
|
|
26
|
-
# if layout_chosen is None:
|
|
27
|
-
# available_layouts = [layout["layoutName"] for layout in layout_file["layouts"]]
|
|
28
|
-
# raise ValueError(f"Layout '{layouts_name}' not found. Available layouts: {available_layouts}")
|
|
29
|
-
layouts_chosen: list[LayoutConfig] = []
|
|
30
|
-
for name in layouts_name:
|
|
31
|
-
layout_chosen = next((layout for layout in layout_file["layouts"] if layout["layoutName"] == name), None)
|
|
32
|
-
if layout_chosen is None:
|
|
33
|
-
layout_chosen = next((layout for layout in layout_file["layouts"] if layout["layoutName"].lower() == name.lower()), None)
|
|
34
|
-
if layout_chosen is None:
|
|
35
|
-
available_layouts = [layout["layoutName"] for layout in layout_file["layouts"]]
|
|
36
|
-
raise ValueError(f"Layout '{name}' not found. Available layouts: {available_layouts}")
|
|
37
|
-
layouts_chosen.append(layout_chosen)
|
|
38
|
-
return layouts_chosen
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def launch_layout(layout_config: LayoutConfig) -> Optional[Exception]:
|
|
42
|
-
import platform
|
|
43
|
-
if platform.system() == "Linux" or platform.system() == "Darwin":
|
|
44
|
-
print("🧑💻 Launching layout using Zellij terminal multiplexer...")
|
|
45
|
-
from machineconfig.cluster.sessions_managers.zellij_local import run_zellij_layout
|
|
46
|
-
run_zellij_layout(layout_config=layout_config)
|
|
47
|
-
elif platform.system() == "Windows":
|
|
48
|
-
print("🧑💻 Launching layout using Windows Terminal...")
|
|
49
|
-
from machineconfig.cluster.sessions_managers.wt_local import run_wt_layout
|
|
50
|
-
|
|
51
|
-
run_wt_layout(layout_config=layout_config)
|
|
52
|
-
else:
|
|
53
|
-
print(f"❌ Unsupported platform: {platform.system()}")
|
|
54
|
-
return None
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def handle_layout_args(args: "FireJobArgs") -> None:
|
|
58
|
-
# args.function = args.path
|
|
59
|
-
# args.path = "layout.json"
|
|
60
|
-
path_obj = sanitize_path(args.path)
|
|
61
|
-
if not path_obj.exists():
|
|
62
|
-
choice_file = match_file_name(sub_string=args.path, search_root=PathExtended.cwd(), suffixes={".json"})
|
|
63
|
-
elif path_obj.is_dir():
|
|
64
|
-
print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
|
|
65
|
-
files = search_for_files_of_interest(path_obj)
|
|
66
|
-
print(f"🔍 Got #{len(files)} results.")
|
|
67
|
-
choice_file = choose_from_options(multi=False, options=files, fzf=True, msg="Choose one option")
|
|
68
|
-
choice_file = PathExtended(choice_file)
|
|
69
|
-
else:
|
|
70
|
-
choice_file = path_obj
|
|
71
|
-
if args.function is None: layouts_name = None
|
|
72
|
-
else: layouts_name = args.function.split(",")
|
|
73
|
-
for a_layout_config in select_layout(layouts_json_file=choice_file, layouts_name=layouts_name):
|
|
74
|
-
launch_layout(layout_config=a_layout_config)
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def get_zellij_cmd(wd1: Path, wd2: Path) -> str:
|
|
5
|
-
_ = wd1, wd2
|
|
6
|
-
lines = [
|
|
7
|
-
""" zellij action new-tab --name gitdiff""",
|
|
8
|
-
"""zellij action new-pane --direction down --name local --cwd ./data """,
|
|
9
|
-
"""zellij action write-chars "cd '{wd1}'; git status" """,
|
|
10
|
-
"""zellij action move-focus up; zellij action close-pane """,
|
|
11
|
-
"""zellij action new-pane --direction down --name remote --cwd code """,
|
|
12
|
-
"""zellij action write-chars "cd '{wd2}' """,
|
|
13
|
-
"""git status" """,
|
|
14
|
-
]
|
|
15
|
-
return "; ".join(lines)
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
# # as per https://github.com/marketplace/models/azure-openai/o1-preview
|
|
2
|
-
# from openai import OpenAI
|
|
3
|
-
# from machineconfig.utils.path_reduced import P as PathExtended
|
|
4
|
-
# from machineconfig.utils.utils2 import read_ini
|
|
5
|
-
# from rich import print as rprint
|
|
6
|
-
# from rich.panel import Panel
|
|
7
|
-
# from typing import Any
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
# gh_token = read_ini(PathExtended.home().joinpath("dotfiles/creds/git/git_host_tokens.ini"))['thisismygitrepo']['newLongterm']
|
|
11
|
-
# endpoint = "https://models.inference.ai.azure.com"
|
|
12
|
-
# model_name_preferences = ["o3-mini", "o1-preview", "o1-mini", "GPT-4o", "GPT-4-o-mini"]
|
|
13
|
-
# client__ = OpenAI(
|
|
14
|
-
# base_url=endpoint,
|
|
15
|
-
# api_key=gh_token,
|
|
16
|
-
# )
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
# def get_response(client: Any, model_name: str, messages: list[dict[str, str]]):
|
|
20
|
-
# print(f"""
|
|
21
|
-
# ┌────────────────────────────────────────────────────────────────
|
|
22
|
-
# │ 🤖 Querying Model: {model_name}
|
|
23
|
-
# │ Sending request to API...
|
|
24
|
-
# └────────────────────────────────────────────────────────────────""")
|
|
25
|
-
# try:
|
|
26
|
-
# response = client.chat.completions.create(
|
|
27
|
-
# messages=messages,
|
|
28
|
-
# model=model_name
|
|
29
|
-
# )
|
|
30
|
-
# return response.choices
|
|
31
|
-
# except Exception as e:
|
|
32
|
-
# print(f"""
|
|
33
|
-
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
34
|
-
# ┃ ❌ API Error with model {model_name}
|
|
35
|
-
# ┃ {str(e)}
|
|
36
|
-
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
|
|
37
|
-
# return None
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
# def interactive_chat():
|
|
41
|
-
# conversation_history = []
|
|
42
|
-
# model_index = 0
|
|
43
|
-
# model_name = model_name_preferences[model_index]
|
|
44
|
-
|
|
45
|
-
# print("""
|
|
46
|
-
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
47
|
-
# ┃ 🚀 Interactive Chat Started
|
|
48
|
-
# ┃ Type your message and press Enter to chat
|
|
49
|
-
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
|
|
50
|
-
|
|
51
|
-
# while True:
|
|
52
|
-
# header = f" 🤖 Using Model: {model_name} "
|
|
53
|
-
# print(f"\n{header.center(80, '═')}\n")
|
|
54
|
-
|
|
55
|
-
# while True:
|
|
56
|
-
# try:
|
|
57
|
-
# user_input = input("💬 You: ")
|
|
58
|
-
# conversation_history.append({"role": "user", "content": user_input})
|
|
59
|
-
|
|
60
|
-
# while True:
|
|
61
|
-
# choices = get_response(client__, model_name, conversation_history)
|
|
62
|
-
# if choices is None:
|
|
63
|
-
# model_index += 1
|
|
64
|
-
# model_name = model_name_preferences[model_index % len(model_name_preferences)]
|
|
65
|
-
# print(f"""
|
|
66
|
-
# ┌────────────────────────────────────────────────────────────────
|
|
67
|
-
# │ 🔄 Model Switch
|
|
68
|
-
# │ Now using: {model_name}
|
|
69
|
-
# └────────────────────────────────────────────────────────────────""")
|
|
70
|
-
# continue
|
|
71
|
-
# else:
|
|
72
|
-
# break
|
|
73
|
-
|
|
74
|
-
# for a_choice in choices:
|
|
75
|
-
# response_content = a_choice.message.content
|
|
76
|
-
# print("\n" * 2)
|
|
77
|
-
# try:
|
|
78
|
-
# rprint(Panel(
|
|
79
|
-
# f"{response_content}",
|
|
80
|
-
# title=f"🤖 AI ({model_name})",
|
|
81
|
-
# border_style="blue"
|
|
82
|
-
# ))
|
|
83
|
-
# except Exception:
|
|
84
|
-
# # Fallback if rich formatting fails
|
|
85
|
-
# print(f"""
|
|
86
|
-
# ┌────────────────────────────────────────────────────────────────
|
|
87
|
-
# │ 🤖 AI ({model_name}):
|
|
88
|
-
# │
|
|
89
|
-
# {response_content}
|
|
90
|
-
# └────────────────────────────────────────────────────────────────""")
|
|
91
|
-
|
|
92
|
-
# conversation_history.append({"role": "assistant", "content": response_content})
|
|
93
|
-
# print("\n")
|
|
94
|
-
# except KeyboardInterrupt:
|
|
95
|
-
# print("""
|
|
96
|
-
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
97
|
-
# ┃ 👋 Chat Session Ended
|
|
98
|
-
# ┃ Thank you for using the interactive chat!
|
|
99
|
-
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
|
|
100
|
-
# return
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
# if __name__ == "__main__":
|
|
104
|
-
# interactive_chat()
|