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.
Files changed (398) hide show
  1. {ellf_cli-20.0.2/ellf_cli.egg-info → ellf_cli-20.0.4}/PKG-INFO +1 -1
  2. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/README.md +4 -4
  3. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/auth.py +22 -8
  4. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/actions.py +2 -1
  5. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/agents.py +2 -1
  6. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/services.py +3 -1
  7. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/tasks.py +2 -1
  8. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf.json +5 -5
  9. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/messages.py +3 -2
  10. 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
  11. 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
  12. {ellf_cli-20.0.2 → ellf_cli-20.0.4/ellf_cli.egg-info}/PKG-INFO +1 -1
  13. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/SOURCES.txt +2 -0
  14. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_auth.py +77 -0
  15. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/LICENSE +0 -0
  16. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/MANIFEST.in +0 -0
  17. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/__init__.py +0 -0
  18. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/__main__.py +0 -0
  19. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/about.json +0 -0
  20. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/about.py +0 -0
  21. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/agents.py +0 -0
  22. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/appdirs.py +0 -0
  23. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/cli.py +0 -0
  24. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/cloud/__init__.py +0 -0
  25. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/cloud/gcp.py +0 -0
  26. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/cluster_config.py +0 -0
  27. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/__init__.py +0 -0
  28. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_cluster_select.py +0 -0
  29. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_org_select.py +0 -0
  30. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_project_scope.py +0 -0
  31. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_recipe_file.py +0 -0
  32. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_recipe_subcommand.py +0 -0
  33. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_state.py +0 -0
  34. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/_usage.py +0 -0
  35. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/assets.py +0 -0
  36. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/auth.py +0 -0
  37. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/clusters.py +0 -0
  38. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/config.py +0 -0
  39. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/datasets.py +0 -0
  40. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/__init__.py +0 -0
  41. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/cp.py +0 -0
  42. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/ls.py +0 -0
  43. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/rm.py +0 -0
  44. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/rsync.py +0 -0
  45. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/files/stats.py +0 -0
  46. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/general.py +0 -0
  47. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/import_export.py +0 -0
  48. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/__init__.py +0 -0
  49. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/_config_io.py +0 -0
  50. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/_helpers.py +0 -0
  51. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/configure.py +0 -0
  52. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/deploy.py +0 -0
  53. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/hibernate.py +0 -0
  54. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/init.py +0 -0
  55. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/init_values.py +0 -0
  56. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/pause.py +0 -0
  57. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/provision.py +0 -0
  58. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/register.py +0 -0
  59. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/setup.py +0 -0
  60. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/start.py +0 -0
  61. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/terraform.py +0 -0
  62. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/infra/tls.py +0 -0
  63. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/jobs.py +0 -0
  64. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/mcp.py +0 -0
  65. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/packages.py +0 -0
  66. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/paths.py +0 -0
  67. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/plans.py +0 -0
  68. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/projects.py +0 -0
  69. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/publish_code.py +0 -0
  70. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/publish_data.py +0 -0
  71. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/recipes.py +0 -0
  72. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/secrets.py +0 -0
  73. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/sessions.py +0 -0
  74. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/support.py +0 -0
  75. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/todos.py +0 -0
  76. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/commands/users.py +0 -0
  77. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/config.py +0 -0
  78. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/.gitignore +0 -0
  79. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/render.py +0 -0
  80. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.assistant.md +0 -0
  81. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.coding.md +0 -0
  82. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.assistant.md +0 -0
  83. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.coding.md +0 -0
  84. {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
  85. {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
  86. {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
  87. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.assistant.md +0 -0
  88. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.coding.md +0 -0
  89. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
  90. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.assistant.md +0 -0
  91. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.assistant.md +0 -0
  92. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.coding.md +0 -0
  93. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.assistant.md +0 -0
  94. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.coding.md +0 -0
  95. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.assistant.md +0 -0
  96. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.coding.md +0 -0
  97. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-monitor/scripts.coding/check_training.py +0 -0
  98. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.assistant.md +0 -0
  99. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.coding.md +0 -0
  100. {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
  101. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-ops/scripts.coding/run_job.py +0 -0
  102. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.coding.md +0 -0
  103. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
  104. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.coding.md +0 -0
  105. {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
  106. {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
  107. {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
  108. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
  109. {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
  110. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
  111. {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
  112. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
  113. {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
  114. {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
  115. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
  116. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
  117. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
  118. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
  119. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
  120. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
  121. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.assistant.md +0 -0
  122. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.coding.md +0 -0
  123. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/references/annotation_agents.md +0 -0
  124. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/references/consulting_patterns.md +0 -0
  125. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/references/explosion_strategy.md +0 -0
  126. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.assistant.md +0 -0
  127. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.coding.md +0 -0
  128. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.assistant.md +0 -0
  129. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.coding.md +0 -0
  130. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.coding.md +0 -0
  131. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.assistant.md +0 -0
  132. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.coding.md +0 -0
  133. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/config_advanced.coding.md +0 -0
  134. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/config_architectures.coding.md +0 -0
  135. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/config_training.coding.md +0 -0
  136. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/diagnostics.md +0 -0
  137. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/evaluation_guide.md +0 -0
  138. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/experiment_patterns.coding.md +0 -0
  139. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/model_selection.md +0 -0
  140. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/training_paradigms.md +0 -0
  141. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/training_troubleshooting.coding.md +0 -0
  142. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.assistant.md +0 -0
  143. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.coding.md +0 -0
  144. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ellf_skills/skills/ellf-train/scripts.coding/ellf_logger.py +0 -0
  145. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/errors.py +0 -0
  146. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/helm.py +0 -0
  147. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/interactivity.py +0 -0
  148. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/key_pair.py +0 -0
  149. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/main.py +0 -0
  150. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/mcp_proxy.py +0 -0
  151. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/pypi_auth.py +0 -0
  152. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/query.py +0 -0
  153. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
  154. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
  155. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
  156. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
  157. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
  158. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
  159. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
  160. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
  161. {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
  162. {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
  163. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/testing/__init__.py +0 -0
  164. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ty.py +0 -0
  165. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/ui.py +0 -0
  166. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/url.py +0 -0
  167. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/util.py +0 -0
  168. {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
  169. {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
  170. {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
  171. {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
  172. {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
  173. {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
  174. {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
  175. {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
  176. {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
  177. {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
  178. {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
  179. {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
  180. {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
  181. {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
  182. {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
  183. {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
  184. {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
  185. {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
  186. {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
  187. {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
  188. {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
  189. {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
  190. {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
  191. {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
  192. {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
  193. {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
  194. {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
  195. {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
  196. {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
  197. {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
  198. {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
  199. {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
  200. {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
  201. {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
  202. {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
  203. {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
  204. {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
  205. {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
  206. {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
  207. {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
  208. {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
  209. {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
  210. {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
  211. {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
  212. {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
  213. {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
  214. {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
  215. {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
  216. {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
  217. {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
  218. {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
  219. {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
  220. {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
  221. {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
  222. {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
  223. {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
  224. {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
  225. {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
  226. {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
  227. {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
  228. {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
  229. {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
  230. {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
  231. {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
  232. {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
  233. {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
  234. {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
  235. {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
  236. {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
  237. {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
  238. {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
  239. {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
  240. {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
  241. {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
  242. {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
  243. {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
  244. {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
  245. {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
  246. {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
  247. {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
  248. {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
  249. {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
  250. {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
  251. {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
  252. {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
  253. {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
  254. {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
  255. {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
  256. {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
  257. {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
  258. {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
  259. {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
  260. {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
  261. {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
  262. {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
  263. {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
  264. {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
  265. {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
  266. {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
  267. {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
  268. {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
  269. {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
  270. {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
  271. {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
  272. {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
  273. {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
  274. {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
  275. {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
  276. {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
  277. {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
  278. {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
  279. {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
  280. {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
  281. {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
  282. {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
  283. {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
  284. {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
  285. {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
  286. {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
  287. {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
  288. {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
  289. {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
  290. {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
  291. {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
  292. {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
  293. {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
  294. {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
  295. {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
  296. {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
  297. {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
  298. {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
  299. {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
  300. {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
  301. {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
  302. {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
  303. {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
  304. {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
  305. {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
  306. {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
  307. {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
  308. {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
  309. {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
  310. {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
  311. {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
  312. {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
  313. {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
  314. {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
  315. {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
  316. {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
  317. {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
  318. {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
  319. {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
  320. {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
  321. {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
  322. {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
  323. {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
  324. {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
  325. {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
  326. {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
  327. {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
  328. {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
  329. {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
  330. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/__init__.py +0 -0
  331. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli/version/read_version.py +0 -0
  332. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/dependency_links.txt +0 -0
  333. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/entry_points.txt +0 -0
  334. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/not-zip-safe +0 -0
  335. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/requires.txt +0 -0
  336. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/ellf_cli.egg-info/top_level.txt +0 -0
  337. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/pyproject.toml +0 -0
  338. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/setup.cfg +0 -0
  339. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/setup.py +0 -0
  340. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_agents.py +0 -0
  341. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_agents_info_stats.py +0 -0
  342. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_appdirs.py +0 -0
  343. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_clusters_info_stats.py +0 -0
  344. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_config.py +0 -0
  345. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_datasets_export.py +0 -0
  346. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_errors.py +0 -0
  347. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_files_cp.py +0 -0
  348. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_files_cp_helpers.py +0 -0
  349. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_helm.py +0 -0
  350. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_import_export.py +0 -0
  351. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_info.py +0 -0
  352. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_config_io.py +0 -0
  353. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_configure.py +0 -0
  354. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_deploy_node_labels.py +0 -0
  355. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_destroy.py +0 -0
  356. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_get_terraform.py +0 -0
  357. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_hibernate.py +0 -0
  358. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_init.py +0 -0
  359. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_pause.py +0 -0
  360. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_provision.py +0 -0
  361. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_start_fixes.py +0 -0
  362. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_start_validation.py +0 -0
  363. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_state_bucket.py +0 -0
  364. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_infra_terraform_init.py +0 -0
  365. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_invalid_secrets.py +0 -0
  366. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_job_list_project_filter.py +0 -0
  367. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_jobs_info_hides_creator.py +0 -0
  368. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_jobs_list_unmatched.py +0 -0
  369. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_key_pair.py +0 -0
  370. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_login.py +0 -0
  371. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_logout.py +0 -0
  372. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_main.py +0 -0
  373. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_mcp_proxy.py +0 -0
  374. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_org_select.py +0 -0
  375. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_plans.py +0 -0
  376. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_projects.py +0 -0
  377. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_projects_delete_confirm.py +0 -0
  378. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_publish_build_poll.py +0 -0
  379. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_publish_data.py +0 -0
  380. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_publish_import_root.py +0 -0
  381. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_publish_requirements.py +0 -0
  382. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_pypi_auth.py +0 -0
  383. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_query.py +0 -0
  384. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_recipe_file.py +0 -0
  385. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_recipe_required_args.py +0 -0
  386. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_recipes.py +0 -0
  387. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_sessions.py +0 -0
  388. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_state.py +0 -0
  389. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_support.py +0 -0
  390. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_todos.py +0 -0
  391. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_ty.py +0 -0
  392. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_ui.py +0 -0
  393. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_ui_extras.py +0 -0
  394. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_usage_counts.py +0 -0
  395. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_users_assign.py +0 -0
  396. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_users_info_stats.py +0 -0
  397. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_users_list.py +0 -0
  398. {ellf_cli-20.0.2 → ellf_cli-20.0.4}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 20.0.2
3
+ Version: 20.0.4
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -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. created or completed
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. created or completed
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. created or completed
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
- AUTH_WAIT_TIME_SECONDS = 60 * 5
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 for up
632
- # to AUTH_WAIT_TIME_SECONDS. Without a terminal there is nobody to
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 five minutes.
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
- last_check = 0
668
- for _ in range(AUTH_WAIT_TIME_SECONDS):
669
- if time.time() > (last_check + int(interval)):
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.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. created or completed
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. created or completed
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. created or completed
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.2",
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. created or completed\n",
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. created or completed\n",
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. created or completed\n",
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://beta.ellf.ai/docs/cluster"
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
@@ -0,0 +1,3 @@
1
+ 20.0.2
2
+ patch
3
+ f4053ad1-8fcd-4591-a68d-bf1e23485ba7
@@ -0,0 +1,3 @@
1
+ 20.0.3
2
+ patch
3
+ 070af1c4-f9d9-4f97-8112-058de90d3ea8
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 20.0.2
3
+ Version: 20.0.4
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -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