ellf-cli 21.0.5__tar.gz → 21.0.7__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 (412) hide show
  1. {ellf_cli-21.0.5/ellf_cli.egg-info → ellf_cli-21.0.7}/PKG-INFO +2 -2
  2. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/auth.py +14 -8
  3. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf.json +1 -1
  4. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.coding.md +22 -3
  5. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.coding.md +60 -12
  6. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.coding.md +24 -2
  7. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.coding.md +2 -1
  8. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.coding.md +1 -1
  9. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-ops/references.coding/data_infra_cli.md +7 -0
  10. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.coding.md +27 -1
  11. ellf_cli-21.0.7/ellf_cli/ellf_skills/skills/ellf-project/references/jev.coding.md +66 -0
  12. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.coding.md +2 -1
  13. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/pypi_auth.py +10 -10
  14. ellf_cli-21.0.7/ellf_cli/version/21.0.5_2026-10-21-09-28-47_patch_fabd5cfe-2d04-4215-abf1-58fba226acb7 +3 -0
  15. ellf_cli-21.0.7/ellf_cli/version/21.0.6_2026-10-22-16-07-37_patch_d2bb27d7-6304-4c99-abbc-46d3dd7e363b +3 -0
  16. {ellf_cli-21.0.5 → ellf_cli-21.0.7/ellf_cli.egg-info}/PKG-INFO +2 -2
  17. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/SOURCES.txt +3 -0
  18. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/requires.txt +1 -1
  19. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_auth.py +19 -2
  20. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/LICENSE +0 -0
  21. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/MANIFEST.in +0 -0
  22. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/README.md +0 -0
  23. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/__init__.py +0 -0
  24. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/__main__.py +0 -0
  25. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/about.json +0 -0
  26. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/about.py +0 -0
  27. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/agents.py +0 -0
  28. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/appdirs.py +0 -0
  29. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/cli.py +0 -0
  30. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/cloud/__init__.py +0 -0
  31. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/cloud/gcp.py +0 -0
  32. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/cluster_config.py +0 -0
  33. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/__init__.py +0 -0
  34. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_cluster_select.py +0 -0
  35. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_org_select.py +0 -0
  36. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_project_scope.py +0 -0
  37. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_recipe_file.py +0 -0
  38. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_recipe_subcommand.py +0 -0
  39. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_state.py +0 -0
  40. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/_usage.py +0 -0
  41. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/actions.py +0 -0
  42. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/agents.py +0 -0
  43. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/assets.py +0 -0
  44. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/auth.py +0 -0
  45. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/clusters.py +0 -0
  46. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/config.py +0 -0
  47. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/datasets.py +0 -0
  48. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/__init__.py +0 -0
  49. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/cp.py +0 -0
  50. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/ls.py +0 -0
  51. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/rm.py +0 -0
  52. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/rsync.py +0 -0
  53. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/files/stats.py +0 -0
  54. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/general.py +0 -0
  55. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/import_export.py +0 -0
  56. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/__init__.py +0 -0
  57. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/_config_io.py +0 -0
  58. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/_helpers.py +0 -0
  59. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/configure.py +0 -0
  60. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/deploy.py +0 -0
  61. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/hibernate.py +0 -0
  62. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/init.py +0 -0
  63. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/init_values.py +0 -0
  64. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/pause.py +0 -0
  65. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/provision.py +0 -0
  66. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/register.py +0 -0
  67. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/setup.py +0 -0
  68. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/start.py +0 -0
  69. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/terraform.py +0 -0
  70. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/infra/tls.py +0 -0
  71. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/jobs.py +0 -0
  72. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/mcp.py +0 -0
  73. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/packages.py +0 -0
  74. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/paths.py +0 -0
  75. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/plans.py +0 -0
  76. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/projects.py +0 -0
  77. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/publish_code.py +0 -0
  78. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/publish_data.py +0 -0
  79. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/recipes.py +0 -0
  80. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/secrets.py +0 -0
  81. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/services.py +0 -0
  82. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/sessions.py +0 -0
  83. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/support.py +0 -0
  84. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/tasks.py +0 -0
  85. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/todos.py +0 -0
  86. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/commands/users.py +0 -0
  87. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/config.py +0 -0
  88. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/.gitignore +0 -0
  89. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/render.py +0 -0
  90. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/SKILL.assistant.md +0 -0
  91. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/annotation_audit.assistant.md +0 -0
  92. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_ellf_annotation_recipes.assistant.md +0 -0
  93. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/builtin_prodigy_recipes.coding.md +0 -0
  94. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-annotate/references/label_schemes.assistant.md +0 -0
  95. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
  96. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.assistant.md +0 -0
  97. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.assistant.md +0 -0
  98. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/SKILL.coding.md +0 -0
  99. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.assistant.md +0 -0
  100. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/references/annotation_metrics.coding.md +0 -0
  101. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.assistant.md +0 -0
  102. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/references/training_monitoring.coding.md +0 -0
  103. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-monitor/scripts.coding/check_training.py +0 -0
  104. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-ops/SKILL.assistant.md +0 -0
  105. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-ops/scripts.coding/run_job.py +0 -0
  106. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.coding.md +0 -0
  107. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
  108. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.coding.md +0 -0
  109. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
  110. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
  111. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
  112. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
  113. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
  114. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
  115. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
  116. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
  117. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_service_recipe.py +0 -0
  118. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
  119. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
  120. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
  121. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
  122. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
  123. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
  124. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
  125. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/SKILL.assistant.md +0 -0
  126. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/references/annotation_agents.md +0 -0
  127. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/references/consulting_patterns.md +0 -0
  128. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/references/explosion_strategy.md +0 -0
  129. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.assistant.md +0 -0
  130. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.assistant.md +0 -0
  131. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-support/SKILL.coding.md +0 -0
  132. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.coding.md +0 -0
  133. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.assistant.md +0 -0
  134. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/SKILL.coding.md +0 -0
  135. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/config_advanced.coding.md +0 -0
  136. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/config_architectures.coding.md +0 -0
  137. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/config_training.coding.md +0 -0
  138. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/diagnostics.md +0 -0
  139. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/evaluation_guide.md +0 -0
  140. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/experiment_patterns.coding.md +0 -0
  141. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/model_selection.md +0 -0
  142. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/training_paradigms.md +0 -0
  143. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/training_troubleshooting.coding.md +0 -0
  144. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.assistant.md +0 -0
  145. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/references/workflow.coding.md +0 -0
  146. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ellf_skills/skills/ellf-train/scripts.coding/ellf_logger.py +0 -0
  147. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/errors.py +0 -0
  148. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/helm.py +0 -0
  149. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/interactivity.py +0 -0
  150. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/key_pair.py +0 -0
  151. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/main.py +0 -0
  152. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/mcp_proxy.py +0 -0
  153. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/messages.py +0 -0
  154. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/query.py +0 -0
  155. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
  156. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
  157. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
  158. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
  159. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
  160. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
  161. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
  162. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
  163. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
  164. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
  165. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/testing/__init__.py +0 -0
  166. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ty.py +0 -0
  167. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/ui.py +0 -0
  168. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/url.py +0 -0
  169. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/util.py +0 -0
  170. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.114_2026-08-19-08-36-57__1a4e37c1-471e-4a81-b4d5-1ffe7dec3a61 +0 -0
  171. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.114_2026-08-19-09-25-21_patch_33ff1e26-0e5e-46d8-8052-ab1d032e8b6c +0 -0
  172. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.115_2026-08-19-09-27-13_patch_4ac728c3-0342-4a36-adbc-e28d2d99b1ba +0 -0
  173. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.116_2026-08-19-09-30-47_patch_c706fef6-6813-4183-b268-12e7b00d7d0b +0 -0
  174. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.117_2026-08-19-09-39-14_patch_c6b0495f-2f88-4aa8-9ebf-0a235b4c407e +0 -0
  175. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.118_2026-08-19-09-52-00_patch_b395655a-8d78-4344-9266-6901c20f6517 +0 -0
  176. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.119_2026-08-19-10-22-38_patch_8f95c49d-aedc-41b8-816d-ccb95f048831 +0 -0
  177. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.120_2026-08-19-10-26-58_patch_7fbf35e6-cc01-4b75-8c9a-f5d054bcaf93 +0 -0
  178. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.121_2026-08-19-10-42-02_patch_31a81b02-a886-4dea-84e0-67cc6ca412d5 +0 -0
  179. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.122_2026-08-19-11-16-49_patch_1c4d7307-48d4-493e-936d-80af799d644b +0 -0
  180. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.123_2026-08-19-11-47-32_patch_d3d78d04-9989-45b1-91b1-93b571d8814a +0 -0
  181. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.124_2026-08-20-08-03-17_patch_57f4c389-2d19-41ce-aca4-13b61c62f387 +0 -0
  182. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.125_2026-08-20-08-25-05_patch_7f368148-0d1c-4525-bbdf-c6d257ad861a +0 -0
  183. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.126_2026-08-20-14-51-36_patch_a99abcc8-3371-4c63-a759-bb7ea5b32432 +0 -0
  184. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.127_2026-08-21-05-48-58_patch_34b4ccee-7596-4f57-93e9-774973cca58e +0 -0
  185. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.128_2026-08-21-10-47-20_patch_693112b9-927c-4a8f-8553-b06eef86079d +0 -0
  186. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.129_2026-08-21-11-16-54_patch_7a981666-01d9-4d1b-9ba3-2129744e3bd5 +0 -0
  187. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.130_2026-08-21-13-09-36_patch_b7ad1a76-ce70-4d70-9d1a-7c414eba5bb4 +0 -0
  188. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.131_2026-08-21-14-31-10_patch_9128ef66-193e-4caf-8710-afd86128e638 +0 -0
  189. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.132_2026-08-24-08-59-34_patch_c600fc14-86a5-460f-9c4e-f0177056f756 +0 -0
  190. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.133_2026-08-24-10-28-29_patch_b6ce3e32-9d7b-48ac-981a-270c22c180dd +0 -0
  191. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.134_2026-08-24-11-00-51_patch_a4fc0484-4a64-46a2-94f8-aa805254c7b0 +0 -0
  192. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.135_2026-08-24-12-12-41_patch_a870a56f-9a65-49eb-92da-f572b26667d8 +0 -0
  193. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.136_2026-08-24-12-42-46_patch_9b399356-6482-4291-8da7-e748a99c4b53 +0 -0
  194. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.137_2026-08-24-12-53-57_patch_f7979348-1910-40cd-a535-90299eca84ee +0 -0
  195. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.138_2026-08-24-14-36-30_patch_ed0f8750-f663-498b-85e7-0d3f2213fcfe +0 -0
  196. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.139_2026-08-25-08-37-26_patch_3ba87e19-902b-4f76-b64c-90e5c0ca1fc6 +0 -0
  197. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.140_2026-08-25-09-52-45_patch_abc830f2-df15-4385-b797-cdaf72c10752 +0 -0
  198. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.141_2026-08-25-11-37-20_patch_1d9ec01e-06f6-4c8e-b095-af17d5b62b00 +0 -0
  199. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.142_2026-08-26-07-38-49_patch_3dd23e36-e7df-494c-986f-a412861a8d40 +0 -0
  200. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.143_2026-08-26-09-32-32_patch_7b7ebd34-de27-4b73-98a7-3e1501e16cd5 +0 -0
  201. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.144_2026-08-26-10-56-43_patch_166064f2-2208-4c9b-9e25-25dc4cd32084 +0 -0
  202. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.145_2026-08-26-11-37-29_patch_b997f3ee-d7d3-4408-9f2f-c8b6d08bdb3b +0 -0
  203. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.146_2026-08-26-12-15-20_patch_afbbb893-25db-468c-81db-2663ca373068 +0 -0
  204. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.147_2026-08-26-14-10-50_patch_fd753b1f-2fa1-4ddb-a9e7-de690da85254 +0 -0
  205. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.148_2026-08-27-09-08-35_patch_23814c0b-7f77-489c-b4a8-ceadd18146e3 +0 -0
  206. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.149_2026-08-27-09-40-17_patch_8879d72e-a3d8-4abc-a16a-d9dcf75f0fa1 +0 -0
  207. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.150_2026-08-27-10-57-25_patch_afbe60ed-3e23-4d88-be3c-f800d7002a7d +0 -0
  208. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.151_2026-08-28-09-02-46_patch_1d4ca23b-aeae-4ea8-96b1-8cf57371f29d +0 -0
  209. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.152_2026-08-28-15-37-24_patch_c9d0bdc1-a7e1-432b-92b9-92dc76fe0c78 +0 -0
  210. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.153_2026-08-29-09-03-27_patch_7531573a-1b33-4092-aa9c-0e65f47b201f +0 -0
  211. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.154_2026-08-29-11-56-35_patch_919f5787-39c8-4dc1-ae6a-f27c28380f21 +0 -0
  212. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.155_2026-08-29-15-15-59_patch_822f9ed8-c366-4e5f-9791-dee8467cf3ce +0 -0
  213. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.156_2026-08-29-16-19-01_patch_3ac2bf36-20f7-4c9f-9fdb-295d4466d59e +0 -0
  214. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.157_2026-08-30-17-32-17_patch_4302354c-c9c5-4be7-acd3-542872a748d8 +0 -0
  215. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.158_2026-08-31-09-28-33_patch_3523774f-c25d-4102-8c1a-92fff046a48d +0 -0
  216. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.159_2026-08-31-10-31-01_patch_fe3e6290-2553-4154-a0a0-8b8a418280ed +0 -0
  217. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.160_2026-08-31-11-23-39_patch_e701a085-3d23-4212-b0af-73b1d419a4c1 +0 -0
  218. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.161_2026-08-31-12-41-01_patch_074d7bde-c493-44db-bc15-e81fd91e2921 +0 -0
  219. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.162_2026-08-31-13-58-06_patch_84db1d60-4280-433b-bd3a-22e5611cd315 +0 -0
  220. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.163_2026-08-31-15-25-54_patch_1931c5ba-73df-48cb-8dcb-555ace0af267 +0 -0
  221. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.163_2026-08-31-15-44-37_patch_3962e805-2a92-494a-a87b-b6e6d66c40a0 +0 -0
  222. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.165_2026-08-31-19-48-59_patch_86e5b923-2b99-4b86-b542-469b197614be +0 -0
  223. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.166_2026-09-01-07-39-57_patch_c344892f-d542-4e7b-8f27-02365a411e15 +0 -0
  224. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.167_2026-09-01-08-21-53_patch_e199d419-282a-4dbb-8756-cf98b7037e2b +0 -0
  225. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.168_2026-09-01-09-12-31_patch_235c9fe0-da15-431d-bb56-01e2b9b15f4b +0 -0
  226. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.169_2026-09-01-11-54-19_patch_98b617ab-d130-42b5-93f2-19cae56d4c4c +0 -0
  227. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.170_2026-09-02-09-27-28_patch_e448d2e6-b7ec-4235-96bf-0173b3623c87 +0 -0
  228. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.171_2026-09-02-12-52-44_patch_e6a241c2-1d62-482c-a9eb-9e3373395c50 +0 -0
  229. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.172_2026-09-04-08-47-04_patch_daae079f-c104-4fcd-bb57-7bff68e80ad9 +0 -0
  230. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.173_2026-09-04-12-34-42_patch_399c4cbd-0c28-4dfd-a4ec-e569420a36e4 +0 -0
  231. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.174_2026-09-04-13-08-48_patch_f5cfe3d5-808e-45e4-bafc-00d0554838ee +0 -0
  232. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.175_2026-09-04-17-20-46_patch_1ef542fa-5d8e-4d90-aa15-9fc4cea3dfec +0 -0
  233. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.176_2026-09-05-08-25-05_patch_ced5521f-f9da-4640-a921-95fcb5cd2e6d +0 -0
  234. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.177_2026-09-05-09-00-16_patch_803c1ad4-a9af-4953-92c5-d882dec03ea2 +0 -0
  235. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.178_2026-09-05-09-30-34_patch_012f6259-2e3f-4591-9806-1920fd06cb1f +0 -0
  236. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.179_2026-09-05-09-33-43_patch_f4bdf28c-d584-47a5-b699-8c883330162c +0 -0
  237. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.180_2026-09-05-12-02-21_patch_34a14b01-d22d-44a8-ac63-be0370a61422 +0 -0
  238. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.181_2026-09-05-12-47-46_patch_56b18867-99f6-4d5c-8215-7b9d60d34010 +0 -0
  239. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.182_2026-09-05-13-35-18_patch_61b7d4d1-73c8-4603-9b0c-593e7405587f +0 -0
  240. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.183_2026-09-06-07-27-09_patch_d76331b2-e3a3-4c0b-8412-ecd131b6ac02 +0 -0
  241. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.184_2026-09-06-10-21-47_patch_7680b7a1-49f0-4eef-b12e-4c854407448c +0 -0
  242. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.185_2026-09-06-10-30-40_patch_e56c2183-77f8-44ef-a92e-7377ea6ce8c1 +0 -0
  243. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.186_2026-09-07-10-00-51_patch_67de5683-d208-4bc0-8fb6-7677377908e7 +0 -0
  244. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.187_2026-09-07-10-18-13_patch_2086cee2-276b-48f7-80ce-6a17397b9541 +0 -0
  245. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.188_2026-09-07-12-51-28_patch_d6590822-068f-4a19-814d-34bbf204ba6e +0 -0
  246. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.189_2026-09-07-12-55-23_patch_7e0fb04b-4d40-4490-974f-c74ba2ae55a1 +0 -0
  247. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.190_2026-09-08-08-58-03_patch_15e3ac1e-4475-4272-bdd8-d00bb0db8f17 +0 -0
  248. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.191_2026-09-08-09-55-58_patch_3d350e50-ee53-4282-bc75-d2251142c46e +0 -0
  249. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.192_2026-09-08-11-12-21_patch_0733223b-1ae2-4b5b-897f-dfc57574ff83 +0 -0
  250. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.193_2026-09-08-21-48-17_patch_8d07d4e6-3555-4720-85c9-9452570fae2d +0 -0
  251. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.194_2026-09-09-07-53-43_patch_69559429-aa42-4b62-9bd7-cdfded1c00d0 +0 -0
  252. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.195_2026-09-09-09-55-40_patch_bbf67f1d-3b9a-43a2-b1bc-22df3fed8a34 +0 -0
  253. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.196_2026-09-09-09-59-47_patch_70d76812-7b3c-4192-ad49-fcaccc29b0da +0 -0
  254. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.197_2026-09-09-13-06-06_patch_d455be0b-5421-492a-b952-fab0fd8110f8 +0 -0
  255. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.198_2026-09-09-13-14-34_patch_267f54e5-311e-435e-882f-8e19191325ea +0 -0
  256. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.199_2026-09-09-22-24-18_patch_81e3e453-ca0e-42fa-9c21-8f94d43c05f2 +0 -0
  257. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.200_2026-09-10-07-19-50_patch_911714fa-1fa3-4165-bfe6-d10c650bf5bf +0 -0
  258. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.201_2026-09-10-10-14-19_patch_864015f2-b0b0-4563-a1c8-155629cb9126 +0 -0
  259. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.202_2026-09-10-11-00-05_patch_18270ecf-e770-4e69-8bcf-e5143c39929b +0 -0
  260. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.203_2026-09-10-11-10-41_patch_ff273ab1-44f3-4bc0-b184-3396e943df04 +0 -0
  261. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.204_2026-09-10-13-02-02_patch_d4ee41e2-d13c-4941-8605-3f1a42b56b22 +0 -0
  262. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.205_2026-09-10-13-57-50_patch_284df67e-5957-4b0c-bc64-5581db6ddecc +0 -0
  263. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.206_2026-09-11-10-18-50_patch_1ac7e410-0e62-4eef-bbe4-ebf93c9d0869 +0 -0
  264. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/17.0.207_2026-09-11-15-26-02_major_3f1b3ed7-eaac-41f5-b740-0af3331595d9 +0 -0
  265. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.0_2026-09-12-10-01-10_patch_8995783a-a9fa-4c4e-90b3-6386a4c481eb +0 -0
  266. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.10_2026-09-14-16-09-38_patch_9403d562-eed0-4125-a8b3-09cd92a13298 +0 -0
  267. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.11_2026-09-15-09-05-57_patch_8b22dba2-d931-4c4d-ae60-db3238d5e73d +0 -0
  268. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.12_2026-09-15-11-18-52_patch_81314afa-e70d-4ad8-b45b-3f8d62b983e7 +0 -0
  269. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.13_2026-09-16-08-00-55_patch_bfa30fc0-3281-4de6-bb56-d7290c98d1c3 +0 -0
  270. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.14_2026-09-16-14-38-26_patch_aae6e9b0-88f4-4bcf-b611-3308c7fcd6eb +0 -0
  271. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.15_2026-09-17-07-58-54_patch_43d40582-effd-4925-a8bd-e70fecf1faab +0 -0
  272. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.16_2026-09-17-08-12-37_patch_b4db2d23-88f1-45c1-82d9-78d38014fcb6 +0 -0
  273. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.17_2026-09-18-09-38-19_patch_25697fc3-e9a8-4980-962b-e6cb0a4760c5 +0 -0
  274. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.18_2026-09-18-09-54-33_patch_d37d9c71-c469-4d94-90d7-4898915ee991 +0 -0
  275. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.19_2026-09-18-10-47-33_patch_47607b3c-d1b6-4864-b9b0-00a2a8d2ac32 +0 -0
  276. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.1_2026-09-12-17-33-30_patch_f6ea2c99-a715-4c4d-876a-23ed8c62a83d +0 -0
  277. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.20_2026-09-18-11-07-21_patch_5a336f91-63a6-4877-97ed-da89395cc8f5 +0 -0
  278. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.21_2026-09-18-13-34-52_patch_c56462e1-63d9-498f-a912-c80c5f0171d1 +0 -0
  279. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.22_2026-09-20-08-10-45_patch_6afa2c20-bcef-4b7d-8685-2c9815d8683f +0 -0
  280. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.23_2026-09-20-08-38-35_patch_a7f169e5-37ab-4ec0-bf89-d14770181303 +0 -0
  281. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.24_2026-09-20-15-49-27_patch_c1222081-ff44-4f20-aea2-5840b6d76efd +0 -0
  282. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.25_2026-09-21-06-11-40_patch_6df46dd9-e7d3-4e71-bec4-e5c93b4ac863 +0 -0
  283. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.26_2026-09-21-07-54-11_patch_cc52dd36-5eba-4094-a1b0-d6f79f103441 +0 -0
  284. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.27_2026-09-21-08-36-49_patch_a25fa125-9bcd-4317-8da5-851c1c329631 +0 -0
  285. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.28_2026-09-21-09-44-01_patch_4430a721-0b3c-4f6a-b9bc-a53e667161bb +0 -0
  286. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.29_2026-09-21-10-58-07_patch_83b2b942-60a4-4bef-afd1-99690ba52b69 +0 -0
  287. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.2_2026-09-13-06-36-33_patch_176bb944-1c49-4dd3-a001-8fce908825a0 +0 -0
  288. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.30_2026-09-21-12-51-16_patch_519b9a65-d400-4234-b113-36b46e315507 +0 -0
  289. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.31_2026-09-22-06-53-35_patch_5c45a235-81b6-4d05-801a-07dc7db61400 +0 -0
  290. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.32_2026-09-22-07-42-04_patch_f12c6415-8166-4063-9e5d-26601b929d63 +0 -0
  291. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.33_2026-09-22-08-12-32_patch_cec31bb0-a6cb-43e6-8407-25aba322b54c +0 -0
  292. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.34_2026-09-23-07-09-16_patch_659fccbb-c0a0-4f6f-bc87-e6abaa8815a7 +0 -0
  293. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.35_2026-09-23-09-38-52_patch_023f904d-807a-4833-8a40-570365e8ec06 +0 -0
  294. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.36_2026-09-23-10-05-33_patch_846fb491-2b1b-47ed-ac1f-ba40e744e199 +0 -0
  295. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.37_2026-09-23-13-08-30_patch_8e4b1d24-156e-4ffe-8e4a-b8740ec18588 +0 -0
  296. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.38_2026-09-24-06-41-37_patch_67adb1d6-3f49-4357-a67f-b1d48f23a972 +0 -0
  297. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.39_2026-09-24-15-24-32_patch_e5dd375d-5643-4514-9b65-8d877c4a2bb2 +0 -0
  298. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.3_2026-09-13-12-32-46_patch_58e5ce3a-f2a7-4789-b2cd-5cc75c72b6ec +0 -0
  299. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.40_2026-09-24-19-58-14_patch_ff18824b-be51-4a3d-a621-e96279e53c3e +0 -0
  300. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.41_2026-09-26-09-24-52_patch_b9979267-30f9-440a-a4ce-c611991d4886 +0 -0
  301. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.42_2026-09-28-12-39-34_patch_dda535d9-8922-4eb9-ab51-6ecff0650c10 +0 -0
  302. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.43_2026-09-28-13-35-27_minor_aca1168a-1286-4326-9d0c-2f2587c9fe92 +0 -0
  303. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.4_2026-09-13-12-45-14_patch_b6c79d55-8f85-4f47-a304-df52b122c38c +0 -0
  304. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.5_2026-09-13-14-11-18_patch_9b111116-5e62-472a-b72c-d1bbafa22c97 +0 -0
  305. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.5_2026-09-13-17-01-11_patch_d4bf61c0-83ac-4dd3-b512-a65805d298c8 +0 -0
  306. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.6_2026-09-14-11-31-04_patch_fd2ebda6-22cb-4e7d-9452-2f6f2640e828 +0 -0
  307. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.7_2026-09-13-17-06-08_patch_428af161-0b27-43c2-8751-e5f7874df120 +0 -0
  308. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.0.9_2026-09-14-12-37-42_patch_b2ca0529-4b67-4fa4-8fdc-5f5e9f5d5166 +0 -0
  309. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.1.0_2026-09-28-14-27-54_patch_324444f7-d24e-4189-b21f-1188894a3109 +0 -0
  310. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/18.1.1_2026-09-28-21-03-07_major_e266a14a-7d96-4ece-92a3-8f34e64438a5 +0 -0
  311. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.0_2026-09-29-11-05-31_patch_77d6f9f8-ead3-4d79-a4b2-b084b2dffc98 +0 -0
  312. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.10_2026-10-02-12-56-52_patch_14e97576-73ca-44b8-82c9-7dad6f1789ab +0 -0
  313. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.11_2026-10-04-10-31-19_patch_088eb371-1799-4949-a119-286cf1cd55d1 +0 -0
  314. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.12_2026-10-06-18-00-25_patch_36554bed-49c5-41cb-9fd4-48cc6af74c09 +0 -0
  315. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.13_2026-10-07-12-24-08_patch_a540a364-3a0d-4960-b278-06ba2c7cc258 +0 -0
  316. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.14_2026-10-07-12-52-39_patch_e3a6fc5c-2ee4-414c-a2dd-4910a655a7dd +0 -0
  317. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.15_2026-10-09-04-15-56_patch_bd7a9b06-867b-4fea-9678-973a05e3022d +0 -0
  318. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.16_2026-10-09-16-11-56_patch_a1135435-7dea-4f00-8c98-203ba3974382 +0 -0
  319. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.17_2026-10-09-17-44-55_patch_faeacad8-541a-40f2-ab9c-abcd66fcd00e +0 -0
  320. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.18_2026-10-10-07-29-38_major_02601a1e-9bdb-45bf-ad67-a07b7dcd0002 +0 -0
  321. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.1_2026-09-29-11-59-38_patch_bbf4753c-d641-4c2f-ac7c-02be6bd8e7c2 +0 -0
  322. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.2_2026-09-29-12-44-07_patch_19fdaa94-60dc-464b-93b8-c17607ebc7b6 +0 -0
  323. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.3_2026-09-29-14-16-00_patch_3cb60272-95cf-4311-8897-721e1b5c2c88 +0 -0
  324. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.4_2026-09-29-16-24-53_patch_9fe8ad2b-e3ec-4558-a5fc-9c44c5c266dc +0 -0
  325. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.5_2026-09-29-17-13-16_patch_e48d2dd2-f41a-402e-a441-756b23c01dcb +0 -0
  326. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.6_2026-09-29-17-22-11_patch_3b1c79e9-9002-4e96-ba78-10668c33be6a +0 -0
  327. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.7_2026-09-30-07-50-58_patch_e8b1f046-d819-499c-9cd5-3e1a20fc9acf +0 -0
  328. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.8_2026-10-01-13-41-44_patch_7d63af18-e0af-4127-ab58-aede2407490f +0 -0
  329. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/19.0.9_2026-10-01-15-57-35_patch_143863cb-8f63-4ef7-bd78-c1114fc93a2d +0 -0
  330. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.0_2026-10-10-09-36-17_patch_d2618f39-cdc9-4d3a-ba40-1a0ad6265f3b +0 -0
  331. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.1_2026-10-11-10-24-33_patch_e29a8713-eecb-4eb1-9641-789d3cfab21a +0 -0
  332. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.2_2026-10-12-07-22-24_patch_f4053ad1-8fcd-4591-a68d-bf1e23485ba7 +0 -0
  333. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.3_2026-10-14-14-29-16_patch_070af1c4-f9d9-4f97-8112-058de90d3ea8 +0 -0
  334. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.4_2026-10-14-16-20-24_patch_c6672844-8227-4e0a-9fb5-36af7e7141dc +0 -0
  335. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.5_2026-10-15-08-53-28_patch_10154146-8afd-4632-b250-9b4b9f5bf67c +0 -0
  336. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.6_2026-10-15-14-17-40_patch_df3a5d3c-f0e0-46cb-aeaf-15b51c8a0f13 +0 -0
  337. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/20.0.7_2026-10-16-07-09-40_major_3e5dfba3-2810-47b4-85a9-938bfff72a04 +0 -0
  338. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/21.0.0_2026-10-16-10-44-29_patch_1058e453-613f-492b-a3c7-f3ca2abe8c2d +0 -0
  339. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/21.0.1_2026-10-16-16-06-10_patch_e20b4ad2-b87f-478e-b4f4-323c8bcc5ea9 +0 -0
  340. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/21.0.2_2026-10-19-13-54-31_patch_bf091df4-00bb-43c8-9117-51047944e305 +0 -0
  341. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/21.0.3_2026-10-19-14-58-29_patch_9b985381-1b1d-4531-b242-b02cea2484c5 +0 -0
  342. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/21.0.4_2026-10-20-17-08-51_patch_38d02583-cb5c-4adc-b5d7-614b483acf19 +0 -0
  343. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/__init__.py +0 -0
  344. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli/version/read_version.py +0 -0
  345. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/dependency_links.txt +0 -0
  346. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/entry_points.txt +0 -0
  347. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/not-zip-safe +0 -0
  348. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/ellf_cli.egg-info/top_level.txt +0 -0
  349. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/pyproject.toml +0 -0
  350. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/setup.cfg +0 -0
  351. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/setup.py +0 -0
  352. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_agents.py +0 -0
  353. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_agents_info_stats.py +0 -0
  354. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_appdirs.py +0 -0
  355. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_clusters_info_stats.py +0 -0
  356. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_config.py +0 -0
  357. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_datasets_export.py +0 -0
  358. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_errors.py +0 -0
  359. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_files_cp.py +0 -0
  360. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_files_cp_helpers.py +0 -0
  361. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_helm.py +0 -0
  362. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_import_export.py +0 -0
  363. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_info.py +0 -0
  364. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_config_io.py +0 -0
  365. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_configure.py +0 -0
  366. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_deploy_node_labels.py +0 -0
  367. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_deploy_preflight.py +0 -0
  368. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_destroy.py +0 -0
  369. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_get_terraform.py +0 -0
  370. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_hibernate.py +0 -0
  371. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_init.py +0 -0
  372. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_pause.py +0 -0
  373. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_provision.py +0 -0
  374. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_start_fixes.py +0 -0
  375. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_start_validation.py +0 -0
  376. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_state_bucket.py +0 -0
  377. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_infra_terraform_init.py +0 -0
  378. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_invalid_secrets.py +0 -0
  379. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_job_list_project_filter.py +0 -0
  380. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_jobs_info_hides_creator.py +0 -0
  381. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_jobs_list_unmatched.py +0 -0
  382. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_key_pair.py +0 -0
  383. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_login.py +0 -0
  384. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_logout.py +0 -0
  385. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_main.py +0 -0
  386. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_mcp_proxy.py +0 -0
  387. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_org_select.py +0 -0
  388. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_plans.py +0 -0
  389. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_projects.py +0 -0
  390. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_projects_delete_confirm.py +0 -0
  391. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_publish_build_poll.py +0 -0
  392. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_publish_data.py +0 -0
  393. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_publish_import_root.py +0 -0
  394. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_publish_requirements.py +0 -0
  395. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_publish_versions.py +0 -0
  396. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_pypi_auth.py +0 -0
  397. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_query.py +0 -0
  398. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_recipe_file.py +0 -0
  399. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_recipe_required_args.py +0 -0
  400. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_recipes.py +0 -0
  401. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_sessions.py +0 -0
  402. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_state.py +0 -0
  403. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_support.py +0 -0
  404. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_todos.py +0 -0
  405. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_ty.py +0 -0
  406. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_ui.py +0 -0
  407. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_ui_extras.py +0 -0
  408. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_usage_counts.py +0 -0
  409. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_users_assign.py +0 -0
  410. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_users_info_stats.py +0 -0
  411. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_users_list.py +0 -0
  412. {ellf_cli-21.0.5 → ellf_cli-21.0.7}/tests/test_util.py +0 -0
@@ -1,18 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 21.0.5
3
+ Version: 21.0.7
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
7
7
  Author-email: contact@explosion.ai
8
8
  License: All rights reserved
9
9
  License-File: LICENSE
10
+ Requires-Dist: certifi>=2026.10.19
10
11
  Requires-Dist: cryptography>=35.0.0
11
12
  Requires-Dist: ellf-broker-sdk
12
13
  Requires-Dist: ellf-pam-sdk
13
14
  Requires-Dist: email-validator
14
15
  Requires-Dist: httpx
15
- Requires-Dist: httpx
16
16
  Requires-Dist: keyring>=24.0.0
17
17
  Requires-Dist: packaging
18
18
  Requires-Dist: pkginfo>=1.7
@@ -673,14 +673,20 @@ class AuthStateImpl:
673
673
  last_check = 0.0
674
674
  while time.monotonic() < deadline:
675
675
  if time.monotonic() > (last_check + int(interval)):
676
- token_response = httpx.post(
677
- token_url,
678
- json={
679
- "grant_type": OIDC_DEVICE_GRANT_TYPE,
680
- "device_code": device_code,
681
- },
682
- timeout=AUTH_REQUEST_TIMEOUT_SECONDS,
683
- )
676
+ try:
677
+ token_response = httpx.post(
678
+ token_url,
679
+ json={
680
+ "grant_type": OIDC_DEVICE_GRANT_TYPE,
681
+ "device_code": device_code,
682
+ },
683
+ timeout=AUTH_REQUEST_TIMEOUT_SECONDS,
684
+ )
685
+ except httpx.TransportError:
686
+ logger.debug("Device token poll failed; retrying", exc_info=True)
687
+ last_check = time.monotonic()
688
+ time.sleep(1)
689
+ continue
684
690
  last_check = time.monotonic()
685
691
  token_data = self._safe_json(token_response, token_url)
686
692
  if token_response.status_code == 200:
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "prog": "ellf",
3
3
  "help": "Ellf Command Line Interface.",
4
- "version": "21.0.5",
4
+ "version": "21.0.7",
5
5
  "extra_key": "_extra",
6
6
  "commands": {
7
7
  "actions": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ellf-annotate
3
- description: "Set up and launch annotation from the coding environment once the methodology, schema, and data are ready. Use when the user wants to start annotation on the Ellf cluster, run a local Prodigy annotation server, choose between built-in Ellf and built-in Prodigy recipes, verify that annotation is ready to launch, preview the annotation setup, or determine whether a new custom recipe is needed. Also trigger on \"I want to annotate\", \"start a local Prodigy server\", \"launch annotation on the cluster\", \"which recipe should I use\", \"can I run this locally\", \"set up review\", or \"help me run annotation\". This skill is the annotation readiness gatekeeper: it applies the audit checklist before launch, prefers built-in workflows when possible, and delegates to `/ellf-prodigy` when a new custom recipe must be implemented."
3
+ description: "Set up and launch annotation from the coding environment once the methodology, schema, and data are ready. Use when the user wants to start annotation on the Ellf cluster, run a local Prodigy annotation server, choose between built-in Ellf and built-in Prodigy recipes, verify that annotation is ready to launch, preview the annotation setup, or determine whether a new custom recipe is needed. Also trigger on \"I want to annotate\", \"start a local Prodigy server\", \"launch annotation on the cluster\", \"which recipe should I use\", \"can I run this locally\", \"set up review\", \"settle disagreements\", \"make the annotation UI easier to use\", or \"help me run annotation\". This skill is the annotation readiness gatekeeper: it applies the audit checklist before launch, prefers built-in workflows when possible, and delegates to `/ellf-prodigy` when a new custom recipe must be implemented."
4
4
  argument-hint: "[describe what you want to annotate]"
5
5
  allowed-tools: Bash(ellf info defaults:*), Bash(echo:*)
6
6
  ---
@@ -24,6 +24,7 @@ You are responsible for:
24
24
  - deciding whether an existing custom recipe is sufficient
25
25
  - deciding when a new custom recipe is required
26
26
  - determining where the user wants annotation to run
27
+ - making the interface work for annotators: checking it with the real data and suggesting layout fixes before anyone labels
27
28
  - launching the annotation process
28
29
  - verifying that it actually starts and is reachable
29
30
 
@@ -43,6 +44,7 @@ Do not launch until you have confirmed:
43
44
  - the recipe choice actually matches the task
44
45
  - the input data is ready
45
46
  - the output dataset or storage target is clear
47
+ - annotators can read the longest examples and reach every option (see "Annotator experience" below)
46
48
 
47
49
  If the audit fails:
48
50
  - route methodological problems to `/ellf-project`
@@ -64,7 +66,13 @@ Use the bundled references as the default selection catalog:
64
66
  Key selection rules:
65
67
  - prefer `.correct` when the user has existing model or LLM predictions to correct; prefer `.manual` when starting from scratch
66
68
  - prefer `.teach` for active learning when labels are a good fit for binary annotation
67
- - keep `review` strictly for adjudicating existing annotations across datasets or annotators — not as a substitute for `.correct`
69
+ - use `review` to settle disagreements between annotators or datasets (see "Settling disagreements" below), not as a substitute for `.correct`
70
+
71
+ ### Settling disagreements
72
+
73
+ When two annotators, or two passes, labelled the same examples and the user needs one answer per example, that is what `review` is for. Give it the datasets to compare: it groups each example's answers, shows each annotator's answer, and saves the settled one to its own dataset. With auto-accept on, the examples everyone agreed on are saved without being shown, so the reviewer only sees the conflicts. Check `ellf tasks create review --help` for the exact args. It only reads structured datasets and takes no annotation instructions, so write the settling rule in the plan and tell the reviewer.
74
+
75
+ A plain labelling task over the disputed examples, with no earlier answers shown, is something else: a third blind answer, not a settlement. It avoids anchoring on the earlier answers, but the reviewer can't see what the disagreement was. If the user wants that, say what it costs and let them choose; default to `review`.
68
76
 
69
77
  ### Existing custom recipe
70
78
 
@@ -119,6 +127,15 @@ ellf-dev run <recipe> [args]
119
127
 
120
128
  For trusted built-in recipes, skip local validation. For custom recipes or anything recently changed, run at least the form preview before cluster launch.
121
129
 
130
+ ## Annotator experience
131
+
132
+ People label faster and more consistently when the interface fits the data. Don't wait for the user to say the layout is awkward: check it yourself before launch and suggest fixes.
133
+
134
+ - Look at it with real data, the longest examples included. For a built-in recipe on the cluster, create the first task, open its annotation URL and look (take a screenshot if you can), or ask the user to open it and say what's awkward. For a custom recipe, use `ellf-dev run`.
135
+ - Go through "Annotator experience" in `${SKILL_DIR}/references/annotation_audit.md` and propose concrete changes: CSS through the task's Prodigy config (`global_css`), flagging (`show_flag`), keyboard shortcuts, a different interface, or splitting the question.
136
+ - A task's settings can't be changed after it's created, so agree the layout on the first task before creating the rest. Keep the agreed Prodigy config in one file in the project and pass it to every task over the same kind of data, rather than retyping it.
137
+ - When a task restates rules that already exist (guidelines, a label scheme), copy the wording or link to it. Shortened or paraphrased rules change the answers people give.
138
+
122
139
  ## Launch
123
140
 
124
141
  ### 1. Confirm unresolved values
@@ -153,6 +170,8 @@ or `prodigy <recipe> ...` if that is the working command in the environment.
153
170
 
154
171
  **Other environment:** clarify the execution model before proceeding.
155
172
 
173
+ If this kind of task will be created again (each round, batch or week), put the steps in a script in the project: building the input, publishing it, creating the task with the shared config, assigning annotators. Run it from there and name it in the plan, so the next round doesn't depend on commands someone has to rewrite.
174
+
156
175
  ## Verification after launch
157
176
 
158
177
  A launch is not complete until you verify that the annotation process is usable.
@@ -196,7 +215,7 @@ When you finish:
196
215
 
197
216
  | File | What it covers | When to read |
198
217
  |------|---------------|--------------|
199
- | `${SKILL_DIR}/references/annotation_audit.md` | Readiness checklist: objective, schema, recipe fit, data, dataset | Before every launch |
218
+ | `${SKILL_DIR}/references/annotation_audit.md` | Readiness checklist: objective, schema, recipe fit, settling disagreements, annotator experience, data, dataset | Before every launch |
200
219
  | `${SKILL_DIR}/references/builtin_ellf_annotation_recipes.md` | Built-in Ellf task and agent recipes with supported workflows | Recipe selection for cluster |
201
220
  | `${SKILL_DIR}/references/builtin_prodigy_recipes.md` | Built-in standalone Prodigy recipes | Recipe selection for local |
202
221
  | `${SKILL_DIR}/references/label_schemes.md` | Label scheme (`labels` asset) format, design and use by tasks and agents. Built-in `ner`, `spans` and `textcat` only | Labels need definitions, building them from annotated data, or writing guidelines |
@@ -29,12 +29,17 @@ over time, it's business logic — factor it out.
29
29
 
30
30
  ### Label set size
31
31
 
32
- More than 6-8 labels per pass creates cognitive overload. Annotator consistency
33
- drops, inter-annotator agreement falls, and the model receives noisier signal.
34
-
35
- **If > 6 labels**: recommend multi-pass (labels-first iteration). Each pass
36
- focuses on 1-3 related labels. Use model predictions to pre-annotate subsequent
37
- passes.
32
+ For spans and entities, more than 6-8 labels per pass creates cognitive
33
+ overload. Annotator consistency drops, inter-annotator agreement falls, and the
34
+ model receives noisier signal. Recommend multi-pass (labels-first iteration):
35
+ each pass focuses on 1-3 related labels, and model predictions pre-annotate
36
+ the later passes.
37
+
38
+ Picking one category per text is easier: annotators compare whole options
39
+ rather than scanning the text for spans. A longer list can work in one pass if
40
+ every label has a description and all the options fit on screen. Watch the
41
+ pilot's flags and agreement: if they show confusion between labels, group them
42
+ or split the question.
38
43
 
39
44
  ### Label definitions
40
45
 
@@ -61,11 +66,14 @@ rules, it should be.
61
66
  | Red flag | What to do |
62
67
  |---|---|
63
68
  | Labels encode business logic | Escalate to ellf-project |
64
- | > 8 labels in one pass | Recommend multi-pass, or escalate if labels need redesign |
69
+ | > 8 span or entity labels in one pass | Recommend multi-pass, or escalate if labels need redesign |
65
70
  | Composite labels (COMPENSATED_EXECUTIVE) | Factor into components (PERSON + COMPENSATION + rules) |
66
71
  | Labels require external knowledge | Factor out — model learns language patterns only |
67
72
  | Annotation mirrors output schema | Redesign — annotation schema ≠ output schema |
68
73
  | Labels without definitions, or definitions only in someone's head | Write a label scheme before launch |
74
+ | Task instructions paraphrase existing guidelines | Copy the wording or link to it |
75
+ | Disagreements settled in a new blind labelling task | Use `review`, or tell the user it's a third blind answer |
76
+ | Long texts or many options left in the default layout | Check the interface with real data and fix it before launch |
69
77
 
70
78
  ---
71
79
 
@@ -95,14 +103,20 @@ the situation is non-standard or the user needs deeper discussion.
95
103
  ### Single vs multi-pass
96
104
 
97
105
  - **≤ 5 labels**: single pass is fine
98
- - **6-8 labels**: consider multi-pass, recommend if annotators report difficulty
99
- - **> 8 labels**: multi-pass required (labels-first iteration)
106
+ - **6-8 span or entity labels**: consider multi-pass, recommend if annotators report difficulty
107
+ - **> 8 span or entity labels**: multi-pass required (labels-first iteration)
108
+ - **One category per text**: see "Label set size" above
100
109
 
101
110
  ### Quality control
102
111
 
103
- - **Always**: validation callbacks for schema constraints
112
+ - **Always**: let the interface enforce schema constraints (e.g. exclusive
113
+ choice for one label per text); a custom recipe can add a `validate_answer`
114
+ callback for the rest
115
+ - **Pilots and reference sets**: flagging on, so annotators can mark the
116
+ examples they hesitated on
104
117
  - **Recommended**: gold-standard examples for onboarding new annotators
105
- - **For teams**: review queue for disagreements
118
+ - **For teams**: settle disagreements with `review` (see "Settling
119
+ disagreements" in the skill)
106
120
 
107
121
  ---
108
122
 
@@ -118,12 +132,46 @@ These catch cases where a different recipe would be significantly more efficient
118
132
  | User picks `spans.manual` but has a trained spans model | Suggest `spans.correct` |
119
133
  | Large dataset, no model assistance | Suggest active learning recipe (`.teach` variants) |
120
134
  | Complex UI needs (custom blocks, multiple views) | Delegate to ellf-prodigy for custom recipe |
135
+ | Two annotators' datasets need one answer per example | `review` over both datasets, with auto-accept so only conflicts are shown |
136
+ | Disputed examples put in a new `textcat` or `ner` task to settle | `review`, unless the user wants a blind third answer |
137
+
138
+ ---
139
+
140
+ ## Annotator experience
141
+
142
+ Check the interface with real data before launch, the longest examples
143
+ included, and propose a fix for anything that fails:
144
+
145
+ - **Text is readable.** Long texts are left-aligned at a normal reading size
146
+ and scroll inside the card if needed, rather than pushing the options or
147
+ buttons off screen. Prose shouldn't be centred, the default for short texts.
148
+ - **Every option is visible without scrolling.** Many options can go in a
149
+ grid. Keyboard shortcuts work.
150
+ - **Labels explain themselves.** With a label scheme, annotators see each
151
+ label's description when they hover it (built-in `ner`, `spans`, `textcat`).
152
+ - **Annotators can say they're unsure.** Flagging is on for pilots and
153
+ reference sets. When one click submits, the flag has to come first: say so
154
+ in the instructions.
155
+ - **Submitting is deliberate.** Submitting on a single click saves time per
156
+ example, but there's no second look; make sure annotators know.
157
+ - **An example can be discussed.** An ID or source shows in the meta, so
158
+ annotators and the user can point to one.
159
+ - **Instructions are short and on the task** (H key), and repeat existing
160
+ rules word for word.
161
+ - **Nothing shown that shouldn't be.** Hide model suggestions and other
162
+ annotators' answers when the labels are a reference or a blind check; show
163
+ them when correcting is the point.
164
+
165
+ Most fixes go in the task's Prodigy config: CSS in `global_css`, `show_flag`,
166
+ keyboard settings. Agree the layout with the user on the first task, keep the
167
+ config in one file in the project, and reuse it for every task over the same
168
+ kind of data.
121
169
 
122
170
  ---
123
171
 
124
172
  ## Escalation Triggers
125
173
 
126
- Escalate to **ellf-project** (via Skill tool) when:
174
+ Escalate to **ellf-project** (`/ellf-project`) when:
127
175
 
128
176
  - Labels encode business logic and need redesign
129
177
  - Task decomposition is needed (complex task → simpler sub-tasks)
@@ -159,11 +159,33 @@ that fit the task type. Their label settings add:
159
159
  `hf_model_agent` runs a fine-tuned model and uses neither instructions nor label
160
160
  definitions.
161
161
 
162
+ ## Jev: confident answers by machine, the rest by people
163
+
164
+ If the cluster lists the `textcat_jev` action, it labels an input asset for text
165
+ classification with TypeSafe's Jev and saves only the answers at or above
166
+ `--min-confidence` (default 0.9). It's an action, not an agent: it runs once over the
167
+ input rather than taking tasks from a queue. Pair it with a `textcat` task over the same
168
+ input and labels that has the Jev dataset in `--settings.exclude`: annotators then only
169
+ see the texts Jev was unsure about.
170
+
171
+ ```bash
172
+ ellf actions create textcat_jev --input <asset> --label-scheme <labels_asset> \
173
+ --labels-exclusive --instructions "<what the labels are for>" \
174
+ --output <jev_dataset> --api-key <secret>
175
+ ellf tasks create textcat --input <asset> --label-scheme <labels_asset> \
176
+ --labels-exclusive --settings.exclude <jev_dataset> ...
177
+ ```
178
+
179
+ It needs a TypeSafe API key as an Ellf secret, and sends the texts to TypeSafe. Before
180
+ trusting its threshold, evaluate it on a human-labelled set with `--min-confidence 0`:
181
+ `${SKILL_DIR}/../ellf-project/references/jev.md`.
182
+
162
183
  ## Selection rules
163
184
 
164
185
  - Prefer a built-in task recipe whenever it fits without bending the schema.
165
- - Use `review` when the user is correcting, adjudicating, or reviewing existing
166
- annotations rather than creating annotations from scratch.
186
+ - Use `review` to settle disagreements or review existing annotations across
187
+ annotators or datasets, rather than to create annotations from scratch or to
188
+ correct a model's suggestions.
167
189
  - If the user needs a custom interface, multi-view workflow, unusual routing,
168
190
  or annotation logic the built-ins cannot express cleanly, delegate to
169
191
  `ellf-prodigy`.
@@ -117,7 +117,8 @@ The export is structured JSONL, one row per answer: the text is in `input.text`,
117
117
  the annotation in `user_anns` (`user_anns.spans` for spans, `user_anns.label` for
118
118
  text classification, `user_anns.accept` for choice; a key missing there comes from
119
119
  `server_anns`, the suggestion as served), the answer in `answer`, and the flag in
120
- `extras.flagged`. Rows don't record who annotated them.
120
+ `extras.flagged`, a key that is only present on flagged rows. Who answered and when is in
121
+ `extras._annotator_id`, `extras._session_id` and `extras._timestamp`.
121
122
 
122
123
  Derive the scheme from the exported JSONL:
123
124
  - **Labels and order:** the labels used in the data, most frequent first.
@@ -25,7 +25,7 @@ You execute ready operations. You do not:
25
25
  - implement new recipe code
26
26
 
27
27
  If the request is not operationally ready:
28
- - use `/ellf-annotate` for annotation readiness and recipe choice
28
+ - use `/ellf-annotate` for annotation readiness and recipe choice, and before creating a labelling task people will work in (recipe, settling disagreements, interface), unless it repeats one that already passed
29
29
  - use `/ellf-train` for training strategy
30
30
  - use `/ellf-project` for planning
31
31
  - use `/ellf-prodigy` for custom recipe implementation
@@ -28,6 +28,13 @@ ellf datasets delete "<name>"
28
28
  ellf datasets export "<name>" --output <path> # exports as JSONL
29
29
  ```
30
30
 
31
+ An exported row is structured, not flat Prodigy JSON: the text is in `input.text`, the
32
+ annotation in `user_anns` (`spans`, `label` or `accept`; a missing key falls back to
33
+ `server_anns`), the answer (`accept`, `reject`, `ignore`) in `answer`, and the
34
+ annotator, session and time in `extras._annotator_id`, `extras._session_id` and
35
+ `extras._timestamp`. Flags are in `extras.flagged`, present only when set, so look
36
+ there before reporting that nothing was flagged.
37
+
31
38
  ## Files
32
39
 
33
40
  Manage files on the cluster's storage bucket directly.
@@ -65,6 +65,8 @@ For long-lived sub-topics, prefer creating a separate named plan over appending
65
65
 
66
66
  If no plan exists yet, create one as soon as the problem statement is clear.
67
67
 
68
+ **Script what will run again.** When a step will be repeated (every round, batch or week), write it as a script in the project's `scripts/`, run it from there, and name it in the plan. One-off lookups can stay inline. A routine in the plan should point to scripts, not to commands someone has to rewrite.
69
+
68
70
  ### Linking to Ellf concepts
69
71
 
70
72
  Project plans are rendered as Markdown, and references to real Ellf concepts — tasks, actions, agents, assets, datasets, recipes, packages, and other plans — display as **inline concept links**: chips with the concept's icon (and a live status indicator for jobs) that link straight to the concept's page in the app. Use them wherever the plan names a concept that already exists, so the plan stays a navigable map of the project rather than a flat document.
@@ -179,7 +181,9 @@ Read this additional reference when relevant:
179
181
  - `${SKILL_DIR}/references/annotation_agents.md`
180
182
  Use when the user has limited annotation capacity, wants LLM-assisted annotation, or is considering agent-heavy data development.
181
183
  - `${SKILL_DIR}/references/label_schemes.md`
182
- Use when designing labels, turning an agreed label set into a `labels` asset, building a scheme from annotated data or a pilot, or planning guidelines for labels that already exist.
184
+ Use when designing labels, turning an agreed label set into a `labels` asset, building a scheme from annotated data or a pilot, reviewing what a pilot's labels and flags say about the scheme, or planning guidelines for labels that already exist. It also describes what an exported dataset row looks like.
185
+ - `${SKILL_DIR}/references/jev.md`
186
+ Use when the user mentions Jev or TypeSafe, or the cluster lists `textcat_jev` and the job is text classification: what the action does, when it fits, and what's specific to evaluating it.
183
187
 
184
188
  These references are your strategic foundation. Apply them naturally. Do not cite them as documents unless the user explicitly asks.
185
189
 
@@ -214,6 +218,8 @@ Use Explosion knowledge base (KB) via the `query_knowledge_base` tool when you n
214
218
  Use KB results to ground your advice. When you find a relevant case study or best practice, weave it naturally into your recommendation.
215
219
  Never dump raw KB output.
216
220
 
221
+ When the user names a model, vendor or tool you don't recognise, check `ellf recipes list` before saying you don't know it: Ellf may integrate it as a built-in recipe. Read the recipe's description and arguments (`ellf actions create <recipe> --help`, or `tasks` / `agents` for those kinds) and advise from that.
222
+
217
223
  ## Plan lifecycle
218
224
 
219
225
  ### Starting a plan
@@ -330,6 +336,13 @@ If something relevant surfaces, mention it briefly — it builds credibility and
330
336
  calibrates the conversation: "This is similar to a skills extraction project
331
337
  where the key was to separate entity recognition from taxonomy mapping."
332
338
 
339
+ **Weigh other framings before recommending one.** The way the user phrased the
340
+ problem is one framing among several. Lay out two or three, and for each say
341
+ which business outcome it would move and what it would need (labels, data,
342
+ people). If the data argues for a different framing, say so. Then pick one, say
343
+ why, and record the rejected ones
344
+ in the decision log. Keep this short; it's a paragraph, not a survey.
345
+
333
346
  **Form a rough pipeline shape early.** Sketch which parts are rule-based, which
334
347
  need ML, which might use an LLM. Share this sketch — even if it's wrong, it
335
348
  gives the user something concrete to react to. This is more valuable than
@@ -431,10 +444,23 @@ evaluation. Apply all of it. Don't let a project plan leave this section empty.
431
444
  **How to run this part of the conversation:**
432
445
 
433
446
  - Make sure every component in the pipeline sketch has an evaluation plan.
447
+ - Name the business outcome the system should move (time saved, cost, errors
448
+ that reach customers) and how it will be measured once it runs. Accuracy on
449
+ the test set is how you choose a system, not how you know it helped.
434
450
  - Push for a held-out test set to be set aside before training starts.
435
451
  - Insist on a rule-based baseline before evaluating any model.
436
452
  - For LLM/generative components: recommend A/B evaluation. Consult the KB for
437
453
  Prodigy-specific workflows.
454
+ - For a classifier that answers with a confidence and leaves the texts it's
455
+ unsure about to people (a spaCy `textcat` model's scores, an LLM's
456
+ probabilities, Jev), the threshold is part of the system:
457
+ - run it on the evaluation set with no threshold, so every answer and its
458
+ confidence is kept;
459
+ - choose the threshold from how accuracy and the share of texts it answers
460
+ change across thresholds, against a bar agreed beforehand, not from one
461
+ accuracy number;
462
+ - record the model version, the threshold and the curve it was chosen from
463
+ in the plan, and pin the version if results have to be reproducible.
438
464
 
439
465
  ### 7. Plan Deployment
440
466
 
@@ -0,0 +1,66 @@
1
+ # Jev — Validating It on the User's Data
2
+
3
+ ## What It Is
4
+
5
+ Jev is TypeSafe's "System One" model. It doesn't generate text: it answers typed
6
+ questions about a text with calibrated probabilities. On Ellf it runs as the built-in
7
+ `textcat_jev` action ("Classify text with Jev"), which labels an input asset for text
8
+ classification and keeps only the answers Jev is confident about. Check that the
9
+ cluster lists it (`ellf recipes list`) before planning around it.
10
+
11
+ What the action does:
12
+ - **Modes** follow the labels: one label is a yes/no question; several exclusive labels
13
+ (`--labels-exclusive`) are one choice question with at most 255 options; several
14
+ non-exclusive labels are one yes/no question per label, asked in the same request.
15
+ - **Label definitions** are sent as the questions' criteria. Pass the labels as a
16
+ `labels` asset (`--label-scheme`) so Jev gets each label's description, look-alikes
17
+ and examples, not just the names. `--instructions` adds context about what the
18
+ labels are for ("Decide whether the review reports a product defect").
19
+ - **Confidence**: each answer comes with a confidence. For non-exclusive labels it's
20
+ the confidence of the label Jev is least sure about. The answer, the confidence and
21
+ every label's probability are saved in the example's `meta.jev`, along with the
22
+ model that answered.
23
+ - **Routing to people**: answers below `--min-confidence` (default 0.9) aren't saved.
24
+ A `textcat` task over the same input and labels with the Jev dataset in
25
+ `--settings.exclude` then shows annotators only the texts Jev was unsure about.
26
+ The action builds its examples like that task does, so the hashes match.
27
+ - **Reruns** skip texts already in the output dataset, so a rerun after a failure
28
+ only asks about the rest.
29
+ - **Privacy**: the texts are sent to TypeSafe's API. Raise this before the user sends
30
+ anything sensitive.
31
+ - **Setup**: a TypeSafe API key stored as an Ellf secret (`--api-key`). A bad key, no
32
+ credits or an unknown model stop the action with the reason.
33
+
34
+ Don't add claims about Jev beyond this — pricing, benchmark numbers, company news.
35
+ If the user asks, say so, and make the case that their own evaluation set answers
36
+ the question that matters.
37
+
38
+ ## When It Fits
39
+
40
+ - The job is text classification: routing, triage, tagging, filtering.
41
+ - The user wants a share of texts handled automatically and the rest left to people,
42
+ rather than one model that has to be right about everything.
43
+ - The labels can be defined in words. Jev reads the definitions; it can't learn a
44
+ distinction nobody can write down.
45
+
46
+ It doesn't do span extraction (NER, spans) or generation.
47
+
48
+ ## Evaluating It
49
+
50
+ Evaluate it like any classifier that answers with a confidence (see the
51
+ evaluation strategy): a human-labelled set Jev never touches, no threshold on the
52
+ evaluation run, and the threshold chosen from the curve. What's specific to the
53
+ action:
54
+
55
+ - "No threshold" means `--min-confidence 0`, into its own dataset. With the
56
+ default 0.9, the answers Jev was unsure about are never saved. Each answer's
57
+ confidence is in `meta.jev`.
58
+ - Pin `--model` to the name Jev reports in `meta.jev` rather than `jev-latest`.
59
+ - Reruns skip texts already in the output dataset, so a run with different labels,
60
+ definitions or instructions needs a new output dataset.
61
+
62
+ ## In the Plan
63
+
64
+ Besides what the evaluation strategy records, note the label scheme and
65
+ instructions Jev was given, and keep Jev's answers in their own dataset, separate
66
+ from the human answers.
@@ -117,7 +117,8 @@ The export is structured JSONL, one row per answer: the text is in `input.text`,
117
117
  the annotation in `user_anns` (`user_anns.spans` for spans, `user_anns.label` for
118
118
  text classification, `user_anns.accept` for choice; a key missing there comes from
119
119
  `server_anns`, the suggestion as served), the answer in `answer`, and the flag in
120
- `extras.flagged`. Rows don't record who annotated them.
120
+ `extras.flagged`, a key that is only present on flagged rows. Who answered and when is in
121
+ `extras._annotator_id`, `extras._session_id` and `extras._timestamp`.
121
122
 
122
123
  Derive the scheme from the exported JSONL:
123
124
  - **Labels and order:** the labels used in the data, most frequent first.
@@ -36,6 +36,7 @@ import httpx
36
36
  import keyring.backend
37
37
  import keyring.credentials
38
38
  import keyring.errors
39
+ from packaging.version import InvalidVersion, Version
39
40
 
40
41
  from .url import URL
41
42
 
@@ -52,9 +53,10 @@ REQUEST_TIMEOUT_SECONDS = 15.0
52
53
  # so a token that is valid when pip asks doesn't expire mid-download.
53
54
  TOKEN_EXPIRY_MARGIN_SECONDS = 60.0
54
55
 
55
- # pip only understands `keyring-provider` in pip.conf from 23.1 on;
56
- # older pips fail on *every* invocation when the key is present.
57
- MIN_PIP_VERSION = (23, 1)
56
+ # pip only understands `keyring-provider` in pip.conf from 23.1 on, and
57
+ # pips before 26.2.2 vendor a certifi that trusts the compromised eMudhra
58
+ # intermediates, so the index token they send could be intercepted.
59
+ MIN_PIP_VERSION = Version("26.2.2")
58
60
 
59
61
 
60
62
  def _request_credentials(pam_url: URL, api_token: str) -> httpx.Response:
@@ -271,15 +273,13 @@ def check_venv_supports_keyring(venv_dir: Path) -> Optional[str]:
271
273
  "load the ellf keyring backend — install ellf-cli into it and "
272
274
  "re-run 'ellf login'"
273
275
  )
274
- pip_version = res.stdout.strip().split(".")
275
276
  try:
276
- major_minor = (int(pip_version[0]), int(pip_version[1]))
277
- except (ValueError, IndexError):
277
+ pip_version = Version(res.stdout.strip())
278
+ except InvalidVersion:
278
279
  return f"could not parse pip version {res.stdout.strip()!r}"
279
- if major_minor < MIN_PIP_VERSION:
280
- needed = ".".join(str(p) for p in MIN_PIP_VERSION)
280
+ if pip_version < MIN_PIP_VERSION:
281
281
  return (
282
- f"pip {res.stdout.strip()} is too old for keyring auth; "
283
- f"upgrade to pip>={needed} in the virtualenv"
282
+ f"pip {pip_version} is too old for keyring auth; "
283
+ f"upgrade to pip>={MIN_PIP_VERSION} in the virtualenv"
284
284
  )
285
285
  return None
@@ -0,0 +1,3 @@
1
+ 21.0.5
2
+ patch
3
+ fabd5cfe-2d04-4215-abf1-58fba226acb7
@@ -0,0 +1,3 @@
1
+ 21.0.6
2
+ patch
3
+ d2bb27d7-6304-4c99-abbc-46d3dd7e363b
@@ -1,18 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 21.0.5
3
+ Version: 21.0.7
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
7
7
  Author-email: contact@explosion.ai
8
8
  License: All rights reserved
9
9
  License-File: LICENSE
10
+ Requires-Dist: certifi>=2026.10.19
10
11
  Requires-Dist: cryptography>=35.0.0
11
12
  Requires-Dist: ellf-broker-sdk
12
13
  Requires-Dist: ellf-pam-sdk
13
14
  Requires-Dist: email-validator
14
15
  Requires-Dist: httpx
15
- Requires-Dist: httpx
16
16
  Requires-Dist: keyring>=24.0.0
17
17
  Requires-Dist: packaging
18
18
  Requires-Dist: pkginfo>=1.7
@@ -139,6 +139,7 @@ ellf_cli/ellf_skills/skills/ellf-project/SKILL.coding.md
139
139
  ellf_cli/ellf_skills/skills/ellf-project/references/annotation_agents.md
140
140
  ellf_cli/ellf_skills/skills/ellf-project/references/consulting_patterns.md
141
141
  ellf_cli/ellf_skills/skills/ellf-project/references/explosion_strategy.md
142
+ ellf_cli/ellf_skills/skills/ellf-project/references/jev.coding.md
142
143
  ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.assistant.md
143
144
  ellf_cli/ellf_skills/skills/ellf-project/references/label_schemes.coding.md
144
145
  ellf_cli/ellf_skills/skills/ellf-support/SKILL.assistant.md
@@ -342,6 +343,8 @@ ellf_cli/version/21.0.1_2026-10-16-16-06-10_patch_e20b4ad2-b87f-478e-b4f4-323c8b
342
343
  ellf_cli/version/21.0.2_2026-10-19-13-54-31_patch_bf091df4-00bb-43c8-9117-51047944e305
343
344
  ellf_cli/version/21.0.3_2026-10-19-14-58-29_patch_9b985381-1b1d-4531-b242-b02cea2484c5
344
345
  ellf_cli/version/21.0.4_2026-10-20-17-08-51_patch_38d02583-cb5c-4adc-b5d7-614b483acf19
346
+ ellf_cli/version/21.0.5_2026-10-21-09-28-47_patch_fabd5cfe-2d04-4215-abf1-58fba226acb7
347
+ ellf_cli/version/21.0.6_2026-10-22-16-07-37_patch_d2bb27d7-6304-4c99-abbc-46d3dd7e363b
345
348
  ellf_cli/version/__init__.py
346
349
  ellf_cli/version/read_version.py
347
350
  tests/test_agents.py
@@ -1,9 +1,9 @@
1
+ certifi>=2026.10.19
1
2
  cryptography>=35.0.0
2
3
  ellf-broker-sdk
3
4
  ellf-pam-sdk
4
5
  email-validator
5
6
  httpx
6
- httpx
7
7
  keyring>=24.0.0
8
8
  packaging
9
9
  pkginfo>=1.7
@@ -134,7 +134,13 @@ class TestPamHostResolution:
134
134
  class TestDeviceLogin:
135
135
  """Polling for the browser's approval in ``ellf login``."""
136
136
 
137
- def _run(self, monkeypatch, polls: Sequence[tuple[int, dict]], *, expires_in=600):
137
+ def _run(
138
+ self,
139
+ monkeypatch,
140
+ polls: Sequence[tuple[int, dict] | Exception],
141
+ *,
142
+ expires_in=600,
143
+ ):
138
144
  import httpx
139
145
 
140
146
  from ellf_cli import auth as auth_module
@@ -156,7 +162,10 @@ class TestDeviceLogin:
156
162
  "expires_in": expires_in,
157
163
  }
158
164
  return httpx.Response(200, json=body)
159
- status, body = next(responses)
165
+ poll = next(responses)
166
+ if isinstance(poll, Exception):
167
+ raise poll
168
+ status, body = poll
160
169
  return httpx.Response(status, json=body)
161
170
 
162
171
  def fake_sleep(seconds):
@@ -205,3 +214,11 @@ class TestDeviceLogin:
205
214
  approved = (200, {"id_token": "id"})
206
215
  tokens, _, _ = self._run(monkeypatch, [flaky, approved])
207
216
  assert tokens == ("id", None)
217
+
218
+ def test_keeps_polling_through_network_errors(self, monkeypatch):
219
+ import httpx
220
+
221
+ dropped = httpx.ReadTimeout("The read operation timed out")
222
+ approved = (200, {"id_token": "id"})
223
+ tokens, _, _ = self._run(monkeypatch, [dropped, approved])
224
+ 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