ellf-cli 20.0.2__tar.gz → 20.0.4__tar.gz
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.
- {ellf_cli-20.0.2/ellf_cli.egg-info → ellf_cli-20.0.4}/PKG-INFO +1 -1
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/README.md +4 -4
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/auth.py +22 -8
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/actions.py +2 -1
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/agents.py +2 -1
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/services.py +3 -1
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/tasks.py +2 -1
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf.json +5 -5
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/messages.py +3 -2
- ellf_cli-20.0.4/ellf_cli/version/20.0.2_2026-10-12-07-22-24_patch_f4053ad1-8fcd-4591-a68d-bf1e23485ba7 +3 -0
- ellf_cli-20.0.4/ellf_cli/version/20.0.3_2026-10-14-14-29-16_patch_070af1c4-f9d9-4f97-8112-058de90d3ea8 +3 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4/ellf_cli.egg-info}/PKG-INFO +1 -1
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/SOURCES.txt +2 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_auth.py +77 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/LICENSE +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/MANIFEST.in +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/__init__.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/__main__.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/about.json +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/about.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/agents.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/appdirs.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/cli.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/cloud/__init__.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/cloud/gcp.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/cluster_config.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/__init__.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_cluster_select.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_org_select.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_project_scope.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_recipe_file.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_recipe_subcommand.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_state.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_usage.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/assets.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/auth.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/clusters.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/config.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/datasets.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/__init__.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/cp.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/ls.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/rm.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/rsync.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/stats.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/general.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/import_export.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/__init__.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/_config_io.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/_helpers.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/configure.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/deploy.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/hibernate.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/init.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/init_values.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/pause.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/provision.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/register.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/setup.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/start.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/terraform.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/tls.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/jobs.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/mcp.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/packages.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/paths.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/plans.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/projects.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/publish_code.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/publish_data.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/recipes.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/secrets.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/sessions.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/support.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/todos.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/users.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/config.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/.gitignore +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/render.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_prodigy_recipes.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/scripts.coding/check_training.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-ops/references.coding/data_infra_cli.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-ops/scripts.coding/run_job.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_service_recipe.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/references/annotation_agents.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/references/consulting_patterns.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/references/explosion_strategy.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/config_advanced.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/config_architectures.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/config_training.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/diagnostics.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/evaluation_guide.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/experiment_patterns.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/model_selection.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/training_paradigms.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/training_troubleshooting.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.assistant.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.coding.md +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/scripts.coding/ellf_logger.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/errors.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/helm.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/interactivity.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/key_pair.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/main.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/mcp_proxy.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/pypi_auth.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/query.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/testing/__init__.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ty.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ui.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/url.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/util.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.114_2026-08-19-08-36-57__1a4e37c1-471e-4a81-b4d5-1ffe7dec3a61 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.114_2026-08-19-09-25-21_patch_33ff1e26-0e5e-46d8-8052-ab1d032e8b6c +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.115_2026-08-19-09-27-13_patch_4ac728c3-0342-4a36-adbc-e28d2d99b1ba +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.116_2026-08-19-09-30-47_patch_c706fef6-6813-4183-b268-12e7b00d7d0b +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.117_2026-08-19-09-39-14_patch_c6b0495f-2f88-4aa8-9ebf-0a235b4c407e +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.118_2026-08-19-09-52-00_patch_b395655a-8d78-4344-9266-6901c20f6517 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.119_2026-08-19-10-22-38_patch_8f95c49d-aedc-41b8-816d-ccb95f048831 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.120_2026-08-19-10-26-58_patch_7fbf35e6-cc01-4b75-8c9a-f5d054bcaf93 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.121_2026-08-19-10-42-02_patch_31a81b02-a886-4dea-84e0-67cc6ca412d5 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.122_2026-08-19-11-16-49_patch_1c4d7307-48d4-493e-936d-80af799d644b +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.123_2026-08-19-11-47-32_patch_d3d78d04-9989-45b1-91b1-93b571d8814a +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.124_2026-08-20-08-03-17_patch_57f4c389-2d19-41ce-aca4-13b61c62f387 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.125_2026-08-20-08-25-05_patch_7f368148-0d1c-4525-bbdf-c6d257ad861a +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.126_2026-08-20-14-51-36_patch_a99abcc8-3371-4c63-a759-bb7ea5b32432 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.127_2026-08-21-05-48-58_patch_34b4ccee-7596-4f57-93e9-774973cca58e +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.128_2026-08-21-10-47-20_patch_693112b9-927c-4a8f-8553-b06eef86079d +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.129_2026-08-21-11-16-54_patch_7a981666-01d9-4d1b-9ba3-2129744e3bd5 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.130_2026-08-21-13-09-36_patch_b7ad1a76-ce70-4d70-9d1a-7c414eba5bb4 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.131_2026-08-21-14-31-10_patch_9128ef66-193e-4caf-8710-afd86128e638 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.132_2026-08-24-08-59-34_patch_c600fc14-86a5-460f-9c4e-f0177056f756 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.133_2026-08-24-10-28-29_patch_b6ce3e32-9d7b-48ac-981a-270c22c180dd +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.134_2026-08-24-11-00-51_patch_a4fc0484-4a64-46a2-94f8-aa805254c7b0 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.135_2026-08-24-12-12-41_patch_a870a56f-9a65-49eb-92da-f572b26667d8 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.136_2026-08-24-12-42-46_patch_9b399356-6482-4291-8da7-e748a99c4b53 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.137_2026-08-24-12-53-57_patch_f7979348-1910-40cd-a535-90299eca84ee +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.138_2026-08-24-14-36-30_patch_ed0f8750-f663-498b-85e7-0d3f2213fcfe +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.139_2026-08-25-08-37-26_patch_3ba87e19-902b-4f76-b64c-90e5c0ca1fc6 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.140_2026-08-25-09-52-45_patch_abc830f2-df15-4385-b797-cdaf72c10752 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.141_2026-08-25-11-37-20_patch_1d9ec01e-06f6-4c8e-b095-af17d5b62b00 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.142_2026-08-26-07-38-49_patch_3dd23e36-e7df-494c-986f-a412861a8d40 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.143_2026-08-26-09-32-32_patch_7b7ebd34-de27-4b73-98a7-3e1501e16cd5 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.144_2026-08-26-10-56-43_patch_166064f2-2208-4c9b-9e25-25dc4cd32084 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.145_2026-08-26-11-37-29_patch_b997f3ee-d7d3-4408-9f2f-c8b6d08bdb3b +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.146_2026-08-26-12-15-20_patch_afbbb893-25db-468c-81db-2663ca373068 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.147_2026-08-26-14-10-50_patch_fd753b1f-2fa1-4ddb-a9e7-de690da85254 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.148_2026-08-27-09-08-35_patch_23814c0b-7f77-489c-b4a8-ceadd18146e3 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.149_2026-08-27-09-40-17_patch_8879d72e-a3d8-4abc-a16a-d9dcf75f0fa1 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.150_2026-08-27-10-57-25_patch_afbe60ed-3e23-4d88-be3c-f800d7002a7d +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.151_2026-08-28-09-02-46_patch_1d4ca23b-aeae-4ea8-96b1-8cf57371f29d +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.152_2026-08-28-15-37-24_patch_c9d0bdc1-a7e1-432b-92b9-92dc76fe0c78 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.153_2026-08-29-09-03-27_patch_7531573a-1b33-4092-aa9c-0e65f47b201f +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.154_2026-08-29-11-56-35_patch_919f5787-39c8-4dc1-ae6a-f27c28380f21 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.155_2026-08-29-15-15-59_patch_822f9ed8-c366-4e5f-9791-dee8467cf3ce +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.156_2026-08-29-16-19-01_patch_3ac2bf36-20f7-4c9f-9fdb-295d4466d59e +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.157_2026-08-30-17-32-17_patch_4302354c-c9c5-4be7-acd3-542872a748d8 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.158_2026-08-31-09-28-33_patch_3523774f-c25d-4102-8c1a-92fff046a48d +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.159_2026-08-31-10-31-01_patch_fe3e6290-2553-4154-a0a0-8b8a418280ed +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.160_2026-08-31-11-23-39_patch_e701a085-3d23-4212-b0af-73b1d419a4c1 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.161_2026-08-31-12-41-01_patch_074d7bde-c493-44db-bc15-e81fd91e2921 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.162_2026-08-31-13-58-06_patch_84db1d60-4280-433b-bd3a-22e5611cd315 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.163_2026-08-31-15-25-54_patch_1931c5ba-73df-48cb-8dcb-555ace0af267 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.163_2026-08-31-15-44-37_patch_3962e805-2a92-494a-a87b-b6e6d66c40a0 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.165_2026-08-31-19-48-59_patch_86e5b923-2b99-4b86-b542-469b197614be +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.166_2026-09-01-07-39-57_patch_c344892f-d542-4e7b-8f27-02365a411e15 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.167_2026-09-01-08-21-53_patch_e199d419-282a-4dbb-8756-cf98b7037e2b +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.168_2026-09-01-09-12-31_patch_235c9fe0-da15-431d-bb56-01e2b9b15f4b +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.169_2026-09-01-11-54-19_patch_98b617ab-d130-42b5-93f2-19cae56d4c4c +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.170_2026-09-02-09-27-28_patch_e448d2e6-b7ec-4235-96bf-0173b3623c87 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.171_2026-09-02-12-52-44_patch_e6a241c2-1d62-482c-a9eb-9e3373395c50 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.172_2026-09-04-08-47-04_patch_daae079f-c104-4fcd-bb57-7bff68e80ad9 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.173_2026-09-04-12-34-42_patch_399c4cbd-0c28-4dfd-a4ec-e569420a36e4 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.174_2026-09-04-13-08-48_patch_f5cfe3d5-808e-45e4-bafc-00d0554838ee +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.175_2026-09-04-17-20-46_patch_1ef542fa-5d8e-4d90-aa15-9fc4cea3dfec +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.176_2026-09-05-08-25-05_patch_ced5521f-f9da-4640-a921-95fcb5cd2e6d +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.177_2026-09-05-09-00-16_patch_803c1ad4-a9af-4953-92c5-d882dec03ea2 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.178_2026-09-05-09-30-34_patch_012f6259-2e3f-4591-9806-1920fd06cb1f +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.179_2026-09-05-09-33-43_patch_f4bdf28c-d584-47a5-b699-8c883330162c +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.180_2026-09-05-12-02-21_patch_34a14b01-d22d-44a8-ac63-be0370a61422 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.181_2026-09-05-12-47-46_patch_56b18867-99f6-4d5c-8215-7b9d60d34010 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.182_2026-09-05-13-35-18_patch_61b7d4d1-73c8-4603-9b0c-593e7405587f +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.183_2026-09-06-07-27-09_patch_d76331b2-e3a3-4c0b-8412-ecd131b6ac02 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.184_2026-09-06-10-21-47_patch_7680b7a1-49f0-4eef-b12e-4c854407448c +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.185_2026-09-06-10-30-40_patch_e56c2183-77f8-44ef-a92e-7377ea6ce8c1 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.186_2026-09-07-10-00-51_patch_67de5683-d208-4bc0-8fb6-7677377908e7 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.187_2026-09-07-10-18-13_patch_2086cee2-276b-48f7-80ce-6a17397b9541 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.188_2026-09-07-12-51-28_patch_d6590822-068f-4a19-814d-34bbf204ba6e +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.189_2026-09-07-12-55-23_patch_7e0fb04b-4d40-4490-974f-c74ba2ae55a1 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.190_2026-09-08-08-58-03_patch_15e3ac1e-4475-4272-bdd8-d00bb0db8f17 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.191_2026-09-08-09-55-58_patch_3d350e50-ee53-4282-bc75-d2251142c46e +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.192_2026-09-08-11-12-21_patch_0733223b-1ae2-4b5b-897f-dfc57574ff83 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.193_2026-09-08-21-48-17_patch_8d07d4e6-3555-4720-85c9-9452570fae2d +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.194_2026-09-09-07-53-43_patch_69559429-aa42-4b62-9bd7-cdfded1c00d0 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.195_2026-09-09-09-55-40_patch_bbf67f1d-3b9a-43a2-b1bc-22df3fed8a34 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.196_2026-09-09-09-59-47_patch_70d76812-7b3c-4192-ad49-fcaccc29b0da +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.197_2026-09-09-13-06-06_patch_d455be0b-5421-492a-b952-fab0fd8110f8 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.198_2026-09-09-13-14-34_patch_267f54e5-311e-435e-882f-8e19191325ea +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.199_2026-09-09-22-24-18_patch_81e3e453-ca0e-42fa-9c21-8f94d43c05f2 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.200_2026-09-10-07-19-50_patch_911714fa-1fa3-4165-bfe6-d10c650bf5bf +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.201_2026-09-10-10-14-19_patch_864015f2-b0b0-4563-a1c8-155629cb9126 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.202_2026-09-10-11-00-05_patch_18270ecf-e770-4e69-8bcf-e5143c39929b +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.203_2026-09-10-11-10-41_patch_ff273ab1-44f3-4bc0-b184-3396e943df04 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.204_2026-09-10-13-02-02_patch_d4ee41e2-d13c-4941-8605-3f1a42b56b22 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.205_2026-09-10-13-57-50_patch_284df67e-5957-4b0c-bc64-5581db6ddecc +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.206_2026-09-11-10-18-50_patch_1ac7e410-0e62-4eef-bbe4-ebf93c9d0869 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/17.0.207_2026-09-11-15-26-02_major_3f1b3ed7-eaac-41f5-b740-0af3331595d9 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.0_2026-09-12-10-01-10_patch_8995783a-a9fa-4c4e-90b3-6386a4c481eb +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.10_2026-09-14-16-09-38_patch_9403d562-eed0-4125-a8b3-09cd92a13298 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.11_2026-09-15-09-05-57_patch_8b22dba2-d931-4c4d-ae60-db3238d5e73d +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.12_2026-09-15-11-18-52_patch_81314afa-e70d-4ad8-b45b-3f8d62b983e7 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.13_2026-09-16-08-00-55_patch_bfa30fc0-3281-4de6-bb56-d7290c98d1c3 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.14_2026-09-16-14-38-26_patch_aae6e9b0-88f4-4bcf-b611-3308c7fcd6eb +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.15_2026-09-17-07-58-54_patch_43d40582-effd-4925-a8bd-e70fecf1faab +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.16_2026-09-17-08-12-37_patch_b4db2d23-88f1-45c1-82d9-78d38014fcb6 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.17_2026-09-18-09-38-19_patch_25697fc3-e9a8-4980-962b-e6cb0a4760c5 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.18_2026-09-18-09-54-33_patch_d37d9c71-c469-4d94-90d7-4898915ee991 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.19_2026-09-18-10-47-33_patch_47607b3c-d1b6-4864-b9b0-00a2a8d2ac32 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.1_2026-09-12-17-33-30_patch_f6ea2c99-a715-4c4d-876a-23ed8c62a83d +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.20_2026-09-18-11-07-21_patch_5a336f91-63a6-4877-97ed-da89395cc8f5 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.21_2026-09-18-13-34-52_patch_c56462e1-63d9-498f-a912-c80c5f0171d1 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.22_2026-09-20-08-10-45_patch_6afa2c20-bcef-4b7d-8685-2c9815d8683f +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.23_2026-09-20-08-38-35_patch_a7f169e5-37ab-4ec0-bf89-d14770181303 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.24_2026-09-20-15-49-27_patch_c1222081-ff44-4f20-aea2-5840b6d76efd +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.25_2026-09-21-06-11-40_patch_6df46dd9-e7d3-4e71-bec4-e5c93b4ac863 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.26_2026-09-21-07-54-11_patch_cc52dd36-5eba-4094-a1b0-d6f79f103441 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.27_2026-09-21-08-36-49_patch_a25fa125-9bcd-4317-8da5-851c1c329631 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.28_2026-09-21-09-44-01_patch_4430a721-0b3c-4f6a-b9bc-a53e667161bb +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.29_2026-09-21-10-58-07_patch_83b2b942-60a4-4bef-afd1-99690ba52b69 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.2_2026-09-13-06-36-33_patch_176bb944-1c49-4dd3-a001-8fce908825a0 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.30_2026-09-21-12-51-16_patch_519b9a65-d400-4234-b113-36b46e315507 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.31_2026-09-22-06-53-35_patch_5c45a235-81b6-4d05-801a-07dc7db61400 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.32_2026-09-22-07-42-04_patch_f12c6415-8166-4063-9e5d-26601b929d63 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.33_2026-09-22-08-12-32_patch_cec31bb0-a6cb-43e6-8407-25aba322b54c +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.34_2026-09-23-07-09-16_patch_659fccbb-c0a0-4f6f-bc87-e6abaa8815a7 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.35_2026-09-23-09-38-52_patch_023f904d-807a-4833-8a40-570365e8ec06 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.36_2026-09-23-10-05-33_patch_846fb491-2b1b-47ed-ac1f-ba40e744e199 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.37_2026-09-23-13-08-30_patch_8e4b1d24-156e-4ffe-8e4a-b8740ec18588 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.38_2026-09-24-06-41-37_patch_67adb1d6-3f49-4357-a67f-b1d48f23a972 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.39_2026-09-24-15-24-32_patch_e5dd375d-5643-4514-9b65-8d877c4a2bb2 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.3_2026-09-13-12-32-46_patch_58e5ce3a-f2a7-4789-b2cd-5cc75c72b6ec +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.40_2026-09-24-19-58-14_patch_ff18824b-be51-4a3d-a621-e96279e53c3e +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.41_2026-09-26-09-24-52_patch_b9979267-30f9-440a-a4ce-c611991d4886 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.42_2026-09-28-12-39-34_patch_dda535d9-8922-4eb9-ab51-6ecff0650c10 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.43_2026-09-28-13-35-27_minor_aca1168a-1286-4326-9d0c-2f2587c9fe92 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.4_2026-09-13-12-45-14_patch_b6c79d55-8f85-4f47-a304-df52b122c38c +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.5_2026-09-13-14-11-18_patch_9b111116-5e62-472a-b72c-d1bbafa22c97 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.5_2026-09-13-17-01-11_patch_d4bf61c0-83ac-4dd3-b512-a65805d298c8 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.6_2026-09-14-11-31-04_patch_fd2ebda6-22cb-4e7d-9452-2f6f2640e828 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.7_2026-09-13-17-06-08_patch_428af161-0b27-43c2-8751-e5f7874df120 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.0.9_2026-09-14-12-37-42_patch_b2ca0529-4b67-4fa4-8fdc-5f5e9f5d5166 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.1.0_2026-09-28-14-27-54_patch_324444f7-d24e-4189-b21f-1188894a3109 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/18.1.1_2026-09-28-21-03-07_major_e266a14a-7d96-4ece-92a3-8f34e64438a5 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.0_2026-09-29-11-05-31_patch_77d6f9f8-ead3-4d79-a4b2-b084b2dffc98 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.10_2026-10-02-12-56-52_patch_14e97576-73ca-44b8-82c9-7dad6f1789ab +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.11_2026-10-04-10-31-19_patch_088eb371-1799-4949-a119-286cf1cd55d1 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.12_2026-10-06-18-00-25_patch_36554bed-49c5-41cb-9fd4-48cc6af74c09 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.13_2026-10-07-12-24-08_patch_a540a364-3a0d-4960-b278-06ba2c7cc258 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.14_2026-10-07-12-52-39_patch_e3a6fc5c-2ee4-414c-a2dd-4910a655a7dd +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.15_2026-10-09-04-15-56_patch_bd7a9b06-867b-4fea-9678-973a05e3022d +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.16_2026-10-09-16-11-56_patch_a1135435-7dea-4f00-8c98-203ba3974382 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.17_2026-10-09-17-44-55_patch_faeacad8-541a-40f2-ab9c-abcd66fcd00e +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.18_2026-10-10-07-29-38_major_02601a1e-9bdb-45bf-ad67-a07b7dcd0002 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.1_2026-09-29-11-59-38_patch_bbf4753c-d641-4c2f-ac7c-02be6bd8e7c2 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.2_2026-09-29-12-44-07_patch_19fdaa94-60dc-464b-93b8-c17607ebc7b6 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.3_2026-09-29-14-16-00_patch_3cb60272-95cf-4311-8897-721e1b5c2c88 +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.4_2026-09-29-16-24-53_patch_9fe8ad2b-e3ec-4558-a5fc-9c44c5c266dc +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.5_2026-09-29-17-13-16_patch_e48d2dd2-f41a-402e-a441-756b23c01dcb +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.6_2026-09-29-17-22-11_patch_3b1c79e9-9002-4e96-ba78-10668c33be6a +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.7_2026-09-30-07-50-58_patch_e8b1f046-d819-499c-9cd5-3e1a20fc9acf +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.8_2026-10-01-13-41-44_patch_7d63af18-e0af-4127-ab58-aede2407490f +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/19.0.9_2026-10-01-15-57-35_patch_143863cb-8f63-4ef7-bd78-c1114fc93a2d +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/20.0.0_2026-10-10-09-36-17_patch_d2618f39-cdc9-4d3a-ba40-1a0ad6265f3b +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/20.0.1_2026-10-11-10-24-33_patch_e29a8713-eecb-4eb1-9641-789d3cfab21a +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/__init__.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/read_version.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/dependency_links.txt +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/entry_points.txt +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/not-zip-safe +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/requires.txt +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/top_level.txt +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/pyproject.toml +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/setup.cfg +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/setup.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_agents.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_agents_info_stats.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_appdirs.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_clusters_info_stats.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_config.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_datasets_export.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_errors.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_files_cp.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_files_cp_helpers.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_helm.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_import_export.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_info.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_config_io.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_configure.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_deploy_node_labels.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_destroy.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_get_terraform.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_hibernate.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_init.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_pause.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_provision.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_start_fixes.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_start_validation.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_state_bucket.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_terraform_init.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_invalid_secrets.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_job_list_project_filter.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_jobs_info_hides_creator.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_jobs_list_unmatched.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_key_pair.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_login.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_logout.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_main.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_mcp_proxy.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_org_select.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_plans.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_projects.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_projects_delete_confirm.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_publish_build_poll.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_publish_data.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_publish_import_root.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_publish_requirements.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_pypi_auth.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_query.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_recipe_file.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_recipe_required_args.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_recipes.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_sessions.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_state.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_support.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_todos.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_ty.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_ui.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_ui_extras.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_usage_counts.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_users_assign.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_users_info_stats.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_users_list.py +0 -0
- {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_util.py +0 -0
|
@@ -27,7 +27,7 @@ Create a new action. The available action recipes are fetched from your cluster
|
|
|
27
27
|
|
|
28
28
|
#### `ellf actions list`
|
|
29
29
|
|
|
30
|
-
List the actions in a project. Uses your default project unless --project is given. By default, this includes their ID, name and current state, e.g.
|
|
30
|
+
List the actions in a project. Uses your default project unless --project is given. By default, this includes their ID, name and current state, e.g. running or succeeded. The state comes straight from the cluster and uses different values from the statuses shown in the app.
|
|
31
31
|
|
|
32
32
|
| Argument | Type | Description | Default |
|
|
33
33
|
| --- | --- | --- | --- |
|
|
@@ -210,7 +210,7 @@ Remove an agent from a task. This will only remove the assignment and keep all a
|
|
|
210
210
|
|
|
211
211
|
#### `ellf agents list`
|
|
212
212
|
|
|
213
|
-
List the agents in a project. Uses your default project unless --project is given. By default, this includes their ID, name and current state, e.g.
|
|
213
|
+
List the agents in a project. Uses your default project unless --project is given. By default, this includes their ID, name and current state, e.g. running or stopped. The state comes straight from the cluster and uses different values from the statuses shown in the app.
|
|
214
214
|
|
|
215
215
|
| Argument | Type | Description | Default |
|
|
216
216
|
| --- | --- | --- | --- |
|
|
@@ -1270,7 +1270,7 @@ Create a new service. The available service recipes are fetched from your cluste
|
|
|
1270
1270
|
|
|
1271
1271
|
#### `ellf services list`
|
|
1272
1272
|
|
|
1273
|
-
List the services in a project. Uses your default project unless --project is given.
|
|
1273
|
+
List the services in a project. Uses your default project unless --project is given. By default, this includes their ID, name and current state, e.g. running or stopped. The state comes straight from the cluster and uses different values from the statuses shown in the app.
|
|
1274
1274
|
|
|
1275
1275
|
| Argument | Type | Description | Default |
|
|
1276
1276
|
| --- | --- | --- | --- |
|
|
@@ -1433,7 +1433,7 @@ Create a new task. The available task recipes are fetched from your cluster and
|
|
|
1433
1433
|
|
|
1434
1434
|
#### `ellf tasks list`
|
|
1435
1435
|
|
|
1436
|
-
List the tasks in a project. Uses your default project unless --project is given. By default, this includes their ID, name and current state, e.g.
|
|
1436
|
+
List the tasks in a project. Uses your default project unless --project is given. By default, this includes their ID, name and current state, e.g. ready or stopped. The state comes straight from the cluster and uses different values from the statuses shown in the app.
|
|
1437
1437
|
|
|
1438
1438
|
| Argument | Type | Description | Default |
|
|
1439
1439
|
| --- | --- | --- | --- |
|
|
@@ -60,7 +60,9 @@ _R = TypeVar("_R")
|
|
|
60
60
|
|
|
61
61
|
OIDC_SCOPE = "openid profile email"
|
|
62
62
|
OIDC_DEVICE_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:device_code"
|
|
63
|
-
|
|
63
|
+
# How long to wait for the browser when the server doesn't say how long
|
|
64
|
+
# its code lasts (RFC 8628 ``expires_in``).
|
|
65
|
+
DEFAULT_DEVICE_CODE_EXPIRY_SECONDS = 60 * 10
|
|
64
66
|
# httpx default is 5s — too tight for the auth round-trip when PAM's
|
|
65
67
|
# load balancer occasionally takes longer than that to respond. A
|
|
66
68
|
# transient network blip during login should not require the user to
|
|
@@ -628,10 +630,10 @@ class AuthStateImpl:
|
|
|
628
630
|
)
|
|
629
631
|
|
|
630
632
|
def _authenticate_device_and_get_id_token(self) -> tuple[str, str | None]:
|
|
631
|
-
# The device flow needs a human at a browser and then polls
|
|
632
|
-
#
|
|
633
|
+
# The device flow needs a human at a browser and then polls until
|
|
634
|
+
# the code expires. Without a terminal there is nobody to
|
|
633
635
|
# complete the sign-in, and the login URL is invisible inside a
|
|
634
|
-
# pipe's block buffer — the run just looks hung for
|
|
636
|
+
# pipe's block buffer — the run just looks hung for ten minutes.
|
|
635
637
|
# Fail fast instead; ELLF_HEADLESS_LOGIN opts scripted flows that
|
|
636
638
|
# consume the login_required JSON back into the old behaviour.
|
|
637
639
|
if not isatty(sys.stdin) and not os.environ.get("ELLF_HEADLESS_LOGIN"):
|
|
@@ -664,9 +666,13 @@ class AuthStateImpl:
|
|
|
664
666
|
if not (device_code and user_code and uri and interval and uri_complete):
|
|
665
667
|
raise CLIError(Messages.E032, data)
|
|
666
668
|
print_login_info(uri_complete, uri, user_code, no_browser=self.no_browser)
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
669
|
+
# Waiting for the code's whole lifetime: a person who approves in the
|
|
670
|
+
# browser after the CLI stops polling is told it worked, and isn't.
|
|
671
|
+
expires_in = int(data.get("expires_in") or DEFAULT_DEVICE_CODE_EXPIRY_SECONDS)
|
|
672
|
+
deadline = time.monotonic() + expires_in
|
|
673
|
+
last_check = 0.0
|
|
674
|
+
while time.monotonic() < deadline:
|
|
675
|
+
if time.monotonic() > (last_check + int(interval)):
|
|
670
676
|
token_response = httpx.post(
|
|
671
677
|
token_url,
|
|
672
678
|
json={
|
|
@@ -675,7 +681,7 @@ class AuthStateImpl:
|
|
|
675
681
|
},
|
|
676
682
|
timeout=AUTH_REQUEST_TIMEOUT_SECONDS,
|
|
677
683
|
)
|
|
678
|
-
last_check = time.
|
|
684
|
+
last_check = time.monotonic()
|
|
679
685
|
token_data = self._safe_json(token_response, token_url)
|
|
680
686
|
if token_response.status_code == 200:
|
|
681
687
|
id_token = token_data.get("id_token")
|
|
@@ -685,5 +691,13 @@ class AuthStateImpl:
|
|
|
685
691
|
)
|
|
686
692
|
ellf_core_token = token_data.get("access_token")
|
|
687
693
|
return id_token, ellf_core_token
|
|
694
|
+
error = token_data.get("error")
|
|
695
|
+
if error == "slow_down":
|
|
696
|
+
interval = int(interval) + 5
|
|
697
|
+
elif (
|
|
698
|
+
token_response.status_code < 500
|
|
699
|
+
and error != "authorization_pending"
|
|
700
|
+
):
|
|
701
|
+
raise EllfIDTokenError(Messages.E195)
|
|
688
702
|
time.sleep(1)
|
|
689
703
|
raise EllfIDTokenError(Messages.E031)
|
|
@@ -157,7 +157,8 @@ def list(
|
|
|
157
157
|
"""
|
|
158
158
|
List the actions in a project. Uses your default project unless --project
|
|
159
159
|
is given. By default, this includes their ID, name and current state,
|
|
160
|
-
e.g.
|
|
160
|
+
e.g. running or succeeded. The state comes straight from the cluster and uses
|
|
161
|
+
different values from the statuses shown in the app.
|
|
161
162
|
"""
|
|
162
163
|
auth = get_auth_state()
|
|
163
164
|
project_uuid = resolve_list_project_id(
|
|
@@ -239,7 +239,8 @@ def list(
|
|
|
239
239
|
"""
|
|
240
240
|
List the agents in a project. Uses your default project unless --project
|
|
241
241
|
is given. By default, this includes their ID, name and current state,
|
|
242
|
-
e.g.
|
|
242
|
+
e.g. running or stopped. The state comes straight from the cluster and uses
|
|
243
|
+
different values from the statuses shown in the app.
|
|
243
244
|
"""
|
|
244
245
|
auth = get_auth_state()
|
|
245
246
|
project_uuid = resolve_list_project_id(project_id, plural="agents", as_json=as_json)
|
|
@@ -154,7 +154,9 @@ def list(
|
|
|
154
154
|
) -> Sequence[ServiceSummary]:
|
|
155
155
|
"""
|
|
156
156
|
List the services in a project. Uses your default project unless
|
|
157
|
-
--project is given.
|
|
157
|
+
--project is given. By default, this includes their ID, name and current
|
|
158
|
+
state, e.g. running or stopped. The state comes straight from the cluster
|
|
159
|
+
and uses different values from the statuses shown in the app.
|
|
158
160
|
"""
|
|
159
161
|
auth = get_auth_state()
|
|
160
162
|
project_uuid = resolve_list_project_id(
|
|
@@ -165,7 +165,8 @@ def list(
|
|
|
165
165
|
"""
|
|
166
166
|
List the tasks in a project. Uses your default project unless --project
|
|
167
167
|
is given. By default, this includes their ID, name and current state,
|
|
168
|
-
e.g.
|
|
168
|
+
e.g. ready or stopped. The state comes straight from the cluster and uses
|
|
169
|
+
different values from the statuses shown in the app.
|
|
169
170
|
"""
|
|
170
171
|
auth = get_auth_state()
|
|
171
172
|
project_uuid = resolve_list_project_id(project_id, plural="tasks", as_json=as_json)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"prog": "ellf",
|
|
3
3
|
"help": "Ellf Command Line Interface.",
|
|
4
|
-
"version": "20.0.
|
|
4
|
+
"version": "20.0.4",
|
|
5
5
|
"extra_key": "_extra",
|
|
6
6
|
"commands": {
|
|
7
7
|
"actions": {
|
|
@@ -652,7 +652,7 @@
|
|
|
652
652
|
"orig_type": "bool"
|
|
653
653
|
}
|
|
654
654
|
],
|
|
655
|
-
"description": "\nList the actions in a project. Uses your default project unless --project\nis given. By default, this includes their ID, name and current state,\ne.g.
|
|
655
|
+
"description": "\nList the actions in a project. Uses your default project unless --project\nis given. By default, this includes their ID, name and current state,\ne.g. running or succeeded. The state comes straight from the cluster and uses\ndifferent values from the statuses shown in the app.\n",
|
|
656
656
|
"allow_extra": false,
|
|
657
657
|
"parent": "actions",
|
|
658
658
|
"is_placeholder": false
|
|
@@ -1307,7 +1307,7 @@
|
|
|
1307
1307
|
"orig_type": "bool"
|
|
1308
1308
|
}
|
|
1309
1309
|
],
|
|
1310
|
-
"description": "\nList the agents in a project. Uses your default project unless --project\nis given. By default, this includes their ID, name and current state,\ne.g.
|
|
1310
|
+
"description": "\nList the agents in a project. Uses your default project unless --project\nis given. By default, this includes their ID, name and current state,\ne.g. running or stopped. The state comes straight from the cluster and uses\ndifferent values from the statuses shown in the app.\n",
|
|
1311
1311
|
"allow_extra": false,
|
|
1312
1312
|
"parent": "agents",
|
|
1313
1313
|
"is_placeholder": false
|
|
@@ -7228,7 +7228,7 @@
|
|
|
7228
7228
|
"orig_type": "bool"
|
|
7229
7229
|
}
|
|
7230
7230
|
],
|
|
7231
|
-
"description": "\nList the services in a project. Uses your default project unless\n--project is given.\n",
|
|
7231
|
+
"description": "\nList the services in a project. Uses your default project unless\n--project is given. By default, this includes their ID, name and current\nstate, e.g. running or stopped. The state comes straight from the cluster\nand uses different values from the statuses shown in the app.\n",
|
|
7232
7232
|
"allow_extra": false,
|
|
7233
7233
|
"parent": "services",
|
|
7234
7234
|
"is_placeholder": false
|
|
@@ -8134,7 +8134,7 @@
|
|
|
8134
8134
|
"orig_type": "bool"
|
|
8135
8135
|
}
|
|
8136
8136
|
],
|
|
8137
|
-
"description": "\nList the tasks in a project. Uses your default project unless --project\nis given. By default, this includes their ID, name and current state,\ne.g.
|
|
8137
|
+
"description": "\nList the tasks in a project. Uses your default project unless --project\nis given. By default, this includes their ID, name and current state,\ne.g. ready or stopped. The state comes straight from the cluster and uses\ndifferent values from the statuses shown in the app.\n",
|
|
8138
8138
|
"allow_extra": false,
|
|
8139
8139
|
"parent": "tasks",
|
|
8140
8140
|
"is_placeholder": false
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# TODO: started with numbers 100+ to make it easier to rearrange and renumber
|
|
2
2
|
# when we tidy up the messages
|
|
3
3
|
|
|
4
|
-
CLUSTER_DOCS_URL = "https://
|
|
4
|
+
CLUSTER_DOCS_URL = "https://ellf.ai/docs/cluster"
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
# fmt: off
|
|
@@ -35,7 +35,7 @@ class Messages:
|
|
|
35
35
|
E028 = "Could not deregister {noun} {name}: cluster error"
|
|
36
36
|
E029 = "Could not deregister {noun} {name}: {noun} not found"
|
|
37
37
|
E030 = "Could not deregister {noun} {name}: forbidden"
|
|
38
|
-
E031 = "Login failed: timed out waiting for browser authentication"
|
|
38
|
+
E031 = "Login failed: timed out waiting for browser authentication. Run `ellf login` to try again."
|
|
39
39
|
E032 = "Login failed: the device authentication API sent an incomplete response"
|
|
40
40
|
E033 = "Login failed: unable to load CLI config from {url}"
|
|
41
41
|
E034 = "{code} {reason} for URL {url}"
|
|
@@ -318,6 +318,7 @@ ellf secret create my-credentials OPENAI_API_KEY="sk-..." CUSTOM_SECRET=-
|
|
|
318
318
|
E192 = "Annotators can't log in via the CLI. Ask an admin of your organization '{org}' to upgrade your role to developer, then run `{command}` again."
|
|
319
319
|
E193 = "Deleting a project has to be confirmed via a terminal. Run `ellf projects delete {name}` again in an interactive terminal session."
|
|
320
320
|
E194 = "Wrong project name, so {name} was not deleted"
|
|
321
|
+
E195 = "Login failed: the login was cancelled in the browser, or its code has expired. Run `ellf login` to try again."
|
|
321
322
|
|
|
322
323
|
|
|
323
324
|
# fmt: on
|
|
@@ -331,6 +331,8 @@ ellf_cli/version/19.0.8_2026-10-01-13-41-44_patch_7d63af18-e0af-4127-ab58-aede24
|
|
|
331
331
|
ellf_cli/version/19.0.9_2026-10-01-15-57-35_patch_143863cb-8f63-4ef7-bd78-c1114fc93a2d
|
|
332
332
|
ellf_cli/version/20.0.0_2026-10-10-09-36-17_patch_d2618f39-cdc9-4d3a-ba40-1a0ad6265f3b
|
|
333
333
|
ellf_cli/version/20.0.1_2026-10-11-10-24-33_patch_e29a8713-eecb-4eb1-9641-789d3cfab21a
|
|
334
|
+
ellf_cli/version/20.0.2_2026-10-12-07-22-24_patch_f4053ad1-8fcd-4591-a68d-bf1e23485ba7
|
|
335
|
+
ellf_cli/version/20.0.3_2026-10-14-14-29-16_patch_070af1c4-f9d9-4f97-8112-058de90d3ea8
|
|
334
336
|
ellf_cli/version/__init__.py
|
|
335
337
|
ellf_cli/version/read_version.py
|
|
336
338
|
tests/test_agents.py
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from collections.abc import Sequence
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
|
|
7
8
|
import pytest
|
|
@@ -128,3 +129,79 @@ class TestPamHostResolution:
|
|
|
128
129
|
|
|
129
130
|
SavedSettings.blank().save(root_cfg.saved_settings_path)
|
|
130
131
|
assert self._resolve(root_cfg) == DEFAULT_PAM_HOST
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class TestDeviceLogin:
|
|
135
|
+
"""Polling for the browser's approval in ``ellf login``."""
|
|
136
|
+
|
|
137
|
+
def _run(self, monkeypatch, polls: Sequence[tuple[int, dict]], *, expires_in=600):
|
|
138
|
+
import httpx
|
|
139
|
+
|
|
140
|
+
from ellf_cli import auth as auth_module
|
|
141
|
+
from ellf_cli.util import URL
|
|
142
|
+
|
|
143
|
+
clock = {"now": 0.0}
|
|
144
|
+
posted: list[str] = []
|
|
145
|
+
responses = iter(polls)
|
|
146
|
+
|
|
147
|
+
def fake_post(url, **kwargs):
|
|
148
|
+
posted.append(url)
|
|
149
|
+
if url.endswith("/device/code"):
|
|
150
|
+
body = {
|
|
151
|
+
"device_code": "dc",
|
|
152
|
+
"user_code": "ABCD-1234",
|
|
153
|
+
"verification_uri": "https://x/auth/device",
|
|
154
|
+
"verification_uri_complete": "https://x/auth/device?user_code=ABCD-1234",
|
|
155
|
+
"interval": 5,
|
|
156
|
+
"expires_in": expires_in,
|
|
157
|
+
}
|
|
158
|
+
return httpx.Response(200, json=body)
|
|
159
|
+
status, body = next(responses)
|
|
160
|
+
return httpx.Response(status, json=body)
|
|
161
|
+
|
|
162
|
+
def fake_sleep(seconds):
|
|
163
|
+
clock["now"] += seconds
|
|
164
|
+
|
|
165
|
+
monkeypatch.setattr(auth_module, "isatty", lambda _: True)
|
|
166
|
+
monkeypatch.setattr(auth_module, "print_login_info", lambda *a, **k: None)
|
|
167
|
+
monkeypatch.setattr(
|
|
168
|
+
auth_module.httpx,
|
|
169
|
+
"get",
|
|
170
|
+
lambda url, **k: httpx.Response(
|
|
171
|
+
200, json={}, request=httpx.Request("GET", url)
|
|
172
|
+
),
|
|
173
|
+
)
|
|
174
|
+
monkeypatch.setattr(auth_module.httpx, "post", fake_post)
|
|
175
|
+
monkeypatch.setattr(auth_module.time, "sleep", fake_sleep)
|
|
176
|
+
monkeypatch.setattr(auth_module.time, "monotonic", lambda: clock["now"])
|
|
177
|
+
auth = object.__new__(auth_module.AuthStateImpl)
|
|
178
|
+
auth._pam_url = URL.parse("https://x")
|
|
179
|
+
auth.no_browser = True
|
|
180
|
+
return auth._authenticate_device_and_get_id_token(), clock, posted
|
|
181
|
+
|
|
182
|
+
def test_waits_past_five_minutes_for_approval(self, monkeypatch):
|
|
183
|
+
pending = (400, {"error": "authorization_pending"})
|
|
184
|
+
approved = (200, {"id_token": "id", "access_token": "core"})
|
|
185
|
+
tokens, clock, _ = self._run(monkeypatch, [pending] * 60 + [approved])
|
|
186
|
+
assert tokens == ("id", "core")
|
|
187
|
+
assert clock["now"] > 300
|
|
188
|
+
|
|
189
|
+
def test_gives_up_when_the_code_expires(self, monkeypatch):
|
|
190
|
+
from ellf_cli.errors import EllfIDTokenError
|
|
191
|
+
|
|
192
|
+
pending = (400, {"error": "authorization_pending"})
|
|
193
|
+
with pytest.raises(EllfIDTokenError, match="timed out"):
|
|
194
|
+
self._run(monkeypatch, [pending] * 1000, expires_in=60)
|
|
195
|
+
|
|
196
|
+
def test_stops_when_cancelled_in_browser(self, monkeypatch):
|
|
197
|
+
from ellf_cli.errors import EllfIDTokenError
|
|
198
|
+
|
|
199
|
+
pending = (400, {"error": "authorization_pending"})
|
|
200
|
+
with pytest.raises(EllfIDTokenError, match="cancelled"):
|
|
201
|
+
self._run(monkeypatch, [pending, (400, {"error": "invalid_grant"})])
|
|
202
|
+
|
|
203
|
+
def test_keeps_polling_through_server_errors(self, monkeypatch):
|
|
204
|
+
flaky = (502, {"error": "OIDC provider unreachable"})
|
|
205
|
+
approved = (200, {"id_token": "id"})
|
|
206
|
+
tokens, _, _ = self._run(monkeypatch, [flaky, approved])
|
|
207
|
+
assert tokens == ("id", None)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.assistant.md
RENAMED
|
File without changes
|
{ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.coding.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.assistant.md
RENAMED
|
File without changes
|
{ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.assistant.md
RENAMED
|
File without changes
|
{ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.coding.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-ops/scripts.coding/run_job.py
RENAMED
|
File without changes
|
{ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.coding.md
RENAMED
|
File without changes
|
|
File without changes
|
{ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.coding.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|