freesolo-flash-dev 1.2.94__tar.gz → 1.2.95__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 (613) hide show
  1. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/__init__.py +14 -19
  3. freesolo_flash_dev-1.2.95/flash/cli/errors.py +277 -0
  4. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/pyproject.toml +2 -2
  5. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_render_theme.py +230 -1
  6. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/uv.lock +1 -1
  7. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.dockerignore +0 -0
  8. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.env.example +0 -0
  9. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/CODEOWNERS +0 -0
  10. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  11. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  12. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  13. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  14. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/dependabot.yml +0 -0
  15. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/auto-rebake.yml +0 -0
  16. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/bake-kernel-cache.yml +0 -0
  17. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/ci.yml +0 -0
  18. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/dev-kernel-cache.yml +0 -0
  19. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/main-source-guard.yml +0 -0
  20. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/notify-tests-repo.yml +0 -0
  21. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  22. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/publish-dev.yml +0 -0
  23. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/publish-image.yml +0 -0
  24. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/publish.yml +0 -0
  25. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/version-parity.yml +0 -0
  26. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.github/workflows/worker-image.yml +0 -0
  27. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/.gitignore +0 -0
  28. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/CHANGELOG.md +0 -0
  29. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/CODE_OF_CONDUCT.md +0 -0
  30. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/CONTRIBUTING.md +0 -0
  31. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/Dockerfile +0 -0
  32. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/Dockerfile.worker +0 -0
  33. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/LICENSE +0 -0
  34. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/NOTICE +0 -0
  35. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/README.md +0 -0
  36. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/SECURITY.md +0 -0
  37. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/SELF_HOSTING.md +0 -0
  38. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/build/kernel_cache/.gitignore +0 -0
  39. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/build/kernel_cache/.keep +0 -0
  40. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/deploy/infisical/README.md +0 -0
  41. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/deploy/infisical/entrypoint.sh +0 -0
  42. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/docker/Dockerfile.kernelcache +0 -0
  43. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/docker/Dockerfile.kernelcache.relayer +0 -0
  44. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/docker/bake_kernel_cache.py +0 -0
  45. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/docker/bake_pod_entry.py +0 -0
  46. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/docker/extract_cudart_fix.py +0 -0
  47. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/docker/kernel_fingerprint.py +0 -0
  48. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/docker/make_rp_handler.py +0 -0
  49. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/__init__.py +0 -0
  50. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/_internal/__init__.py +0 -0
  51. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/_internal/channel.py +0 -0
  52. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/_internal/diagnostics.py +0 -0
  53. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/_internal/fileio.py +0 -0
  54. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/_internal/logging.py +0 -0
  55. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/_internal/paths.py +0 -0
  56. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/adapters/__init__.py +0 -0
  57. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/adapters/artifacts.py +0 -0
  58. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/adapters/fused_experts.py +0 -0
  59. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/adapters/lora_rank.py +0 -0
  60. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/adapters/targets.py +0 -0
  61. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/__main__.py +0 -0
  62. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/__init__.py +0 -0
  63. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/deploy.py +0 -0
  64. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/__init__.py +0 -0
  65. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/episode.py +0 -0
  66. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/eval.py +0 -0
  67. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/eval_args.py +0 -0
  68. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/imports.py +0 -0
  69. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/list.py +0 -0
  70. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/push.py +0 -0
  71. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/retained.py +0 -0
  72. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/setup.py +0 -0
  73. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/setup_wandb.py +0 -0
  74. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/test.py +0 -0
  75. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/test_evaluations.py +0 -0
  76. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/test_params.py +0 -0
  77. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/env/test_warnings.py +0 -0
  78. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/prompt_budget.py +0 -0
  79. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/traces.py +0 -0
  80. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/train_cost.py +0 -0
  81. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/commands/worker_output.py +0 -0
  82. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/scaffold/TRAINING.md +0 -0
  83. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/scaffold/__init__.py +0 -0
  84. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/ui/__init__.py +0 -0
  85. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/ui/cost.py +0 -0
  86. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/ui/env_panels.py +0 -0
  87. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/ui/heartbeat.py +0 -0
  88. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/ui/render.py +0 -0
  89. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/ui/tables.py +0 -0
  90. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cli/ui/tty.py +0 -0
  91. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/client/__init__.py +0 -0
  92. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/client/config.py +0 -0
  93. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/client/freesolo_api.py +0 -0
  94. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/client/http.py +0 -0
  95. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/client/runtime_secrets.py +0 -0
  96. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/client/shapes.py +0 -0
  97. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/client/specs.py +0 -0
  98. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/client/streaming.py +0 -0
  99. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/content/__init__.py +0 -0
  100. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/content/image_descriptors.py +0 -0
  101. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/content/multimodal.py +0 -0
  102. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/content/structured_outputs.py +0 -0
  103. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/content/thinking.py +0 -0
  104. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/core/__init__.py +0 -0
  105. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/core/catalog.py +0 -0
  106. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/core/grpo.py +0 -0
  107. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/core/spec.py +0 -0
  108. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/core/spec_persistence.py +0 -0
  109. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cost/__init__.py +0 -0
  110. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cost/analytical.py +0 -0
  111. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cost/facts.py +0 -0
  112. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cost/spec.py +0 -0
  113. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/cost/types.py +0 -0
  114. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/__init__.py +0 -0
  115. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/huggingface.py +0 -0
  116. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/plan/__init__.py +0 -0
  117. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/plan/kv_sizing.py +0 -0
  118. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/plan/model_config_probe.py +0 -0
  119. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/plan/prompt_budget.py +0 -0
  120. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/plan/recipe.py +0 -0
  121. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/plan/steps.py +0 -0
  122. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/plan/vram.py +0 -0
  123. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/profiling/__init__.py +0 -0
  124. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/profiling/dataset_profile.py +0 -0
  125. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/profiling/image_tokens.py +0 -0
  126. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/profiling/reasoning_render.py +0 -0
  127. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/profiling/sft_image_rows.py +0 -0
  128. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/profiling/sft_workload.py +0 -0
  129. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/profiling/tokenizer.py +0 -0
  130. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/profiling/workload_profile.py +0 -0
  131. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/result/__init__.py +0 -0
  132. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/result/accounting.py +0 -0
  133. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/result/rollout_samples.py +0 -0
  134. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/__init__.py +0 -0
  135. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/__main__.py +0 -0
  136. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/backend_common.py +0 -0
  137. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/entry/__init__.py +0 -0
  138. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/entry/opd.py +0 -0
  139. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/entry/rl.py +0 -0
  140. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/entry/sft.py +0 -0
  141. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/io/__init__.py +0 -0
  142. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/io/heartbeat.py +0 -0
  143. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/io/hf.py +0 -0
  144. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/io/prefetch.py +0 -0
  145. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/io/wandb_log.py +0 -0
  146. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/model/__init__.py +0 -0
  147. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/model/adapter.py +0 -0
  148. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/model/chatml_mask.py +0 -0
  149. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/model/decoding.py +0 -0
  150. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/model/lora.py +0 -0
  151. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/model/packing.py +0 -0
  152. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/opd_train.py +0 -0
  153. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/opd_train_runner.py +0 -0
  154. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/perf/__init__.py +0 -0
  155. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/perf/diagnostics.py +0 -0
  156. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/perf/lifecycle.py +0 -0
  157. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/perf/liger.py +0 -0
  158. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/perf/memory.py +0 -0
  159. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/rl_train.py +0 -0
  160. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/rl_train_runner.py +0 -0
  161. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/runtime/__init__.py +0 -0
  162. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  163. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  164. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/runtime/rng.py +0 -0
  165. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/score_batcher.py +0 -0
  166. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/sft_train.py +0 -0
  167. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/sft_train_runner.py +0 -0
  168. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/teacher/__init__.py +0 -0
  169. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/teacher/client.py +0 -0
  170. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/teacher/encoding.py +0 -0
  171. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  172. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/__init__.py +0 -0
  173. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/core/__init__.py +0 -0
  174. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  175. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/core/child/__init__.py +0 -0
  176. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/core/child/glue.py +0 -0
  177. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/core/child/runtime.py +0 -0
  178. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/core/step_timing.py +0 -0
  179. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/finalize.py +0 -0
  180. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/__init__.py +0 -0
  181. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/batching.py +0 -0
  182. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/bridge.py +0 -0
  183. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
  184. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  185. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  186. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/child/entry.py +0 -0
  187. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  188. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  189. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  190. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  191. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/child/structured.py +0 -0
  192. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/failures.py +0 -0
  193. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/gkd.py +0 -0
  194. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/multiturn_media.py +0 -0
  195. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  196. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/overrides.py +0 -0
  197. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/prompts.py +0 -0
  198. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/reporting.py +0 -0
  199. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/scoring.py +0 -0
  200. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/state.py +0 -0
  201. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/opd/validation.py +0 -0
  202. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/__init__.py +0 -0
  203. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  204. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  205. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/child/entry.py +0 -0
  206. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  207. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/child/patches.py +0 -0
  208. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  209. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/config.py +0 -0
  210. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/identity.py +0 -0
  211. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/inputs.py +0 -0
  212. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  213. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/reward_module.py +0 -0
  214. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/scoring.py +0 -0
  215. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/single_turn.py +0 -0
  216. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/rl/verl_config.py +0 -0
  217. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/sft/__init__.py +0 -0
  218. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  219. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/sft/child/entry.py +0 -0
  220. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  221. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/train/sft/config.py +0 -0
  222. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/verl/__init__.py +0 -0
  223. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/verl/capabilities.py +0 -0
  224. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/verl/checkpoints.py +0 -0
  225. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/verl/child_io.py +0 -0
  226. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/verl/diagnostics.py +0 -0
  227. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/verl/parallelism.py +0 -0
  228. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/verl/parent_work.py +0 -0
  229. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker/verl/process_census.py +0 -0
  230. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/engine/worker_entrypoint.py +0 -0
  231. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/__init__.py +0 -0
  232. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/adapter.py +0 -0
  233. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/base.py +0 -0
  234. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/cache_security.py +0 -0
  235. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/dataset_selection.py +0 -0
  236. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/evaluations.py +0 -0
  237. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/identity.py +0 -0
  238. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/loader.py +0 -0
  239. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/namespace_listing.py +0 -0
  240. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/package/__init__.py +0 -0
  241. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/package/direct_tokens.py +0 -0
  242. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/package/limits.py +0 -0
  243. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/package/unpack.py +0 -0
  244. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/pull.py +0 -0
  245. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/envs/staged.py +0 -0
  246. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/__init__.py +0 -0
  247. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/__init__.py +0 -0
  248. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/auth.py +0 -0
  249. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/bootstrap.py +0 -0
  250. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  251. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  252. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  253. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/deadline.py +0 -0
  254. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/host/__init__.py +0 -0
  255. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  256. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/host/failmark.py +0 -0
  257. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  258. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/http.py +0 -0
  259. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/instance.py +0 -0
  260. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/poll.py +0 -0
  261. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/poll_instance.py +0 -0
  262. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/provider.py +0 -0
  263. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
  264. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/_lifecycle/worker.py +0 -0
  265. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/allocator.py +0 -0
  266. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/artifacts/__init__.py +0 -0
  267. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/artifacts/hf.py +0 -0
  268. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/artifacts/preload_runpod.py +0 -0
  269. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/artifacts/weight_cache.py +0 -0
  270. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/base.py +0 -0
  271. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/fit_errors.py +0 -0
  272. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/lambda_/__init__.py +0 -0
  273. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/lambda_/api.py +0 -0
  274. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/lambda_/auth.py +0 -0
  275. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/lambda_/gpus.py +0 -0
  276. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/lambda_/jobs/__init__.py +0 -0
  277. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/lambda_/jobs/builders.py +0 -0
  278. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/lambda_/jobs/reap.py +0 -0
  279. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/lambda_/preflight.py +0 -0
  280. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/lambda_/pricing.py +0 -0
  281. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/preflight.py +0 -0
  282. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/realized.py +0 -0
  283. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/__init__.py +0 -0
  284. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/api.py +0 -0
  285. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/auth.py +0 -0
  286. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/cost.py +0 -0
  287. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/gpus.py +0 -0
  288. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/job_execution.py +0 -0
  289. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/jobs.py +0 -0
  290. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/preflight.py +0 -0
  291. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/pricing.py +0 -0
  292. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/resources.py +0 -0
  293. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/serverless/__init__.py +0 -0
  294. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/runpod/serverless/endpoints.py +0 -0
  295. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/sharding.py +0 -0
  296. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/vast/__init__.py +0 -0
  297. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/vast/api.py +0 -0
  298. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/vast/auth.py +0 -0
  299. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/vast/jobs/__init__.py +0 -0
  300. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/vast/jobs/builders.py +0 -0
  301. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/vast/preflight.py +0 -0
  302. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/providers/vast/pricing.py +0 -0
  303. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/py.typed +0 -0
  304. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/__init__.py +0 -0
  305. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/artifacts.py +0 -0
  306. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/attempts.py +0 -0
  307. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/costs.py +0 -0
  308. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/deadlines.py +0 -0
  309. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/preparation.py +0 -0
  310. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/reconciliation.py +0 -0
  311. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/results/__init__.py +0 -0
  312. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/results/checkpoints.py +0 -0
  313. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/results/verified_revisions.py +0 -0
  314. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/status.py +0 -0
  315. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/submit.py +0 -0
  316. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/supervise/__init__.py +0 -0
  317. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/supervise/attach.py +0 -0
  318. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/supervise/deploy.py +0 -0
  319. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/supervise/lifecycle.py +0 -0
  320. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/supervise/recovery.py +0 -0
  321. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/supervise/retry_decision.py +0 -0
  322. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/supervise/seed_submission.py +0 -0
  323. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/supervise/transitions.py +0 -0
  324. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runner/weight_cache.py +0 -0
  325. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runtime_capsule/__init__.py +0 -0
  326. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runtime_capsule/build.py +0 -0
  327. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runtime_capsule/manifest.py +0 -0
  328. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/runtime_capsule/profiles.py +0 -0
  329. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/schema/__init__.py +0 -0
  330. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/schema/fields.py +0 -0
  331. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/serve/__init__.py +0 -0
  332. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/serve/adapter_check.py +0 -0
  333. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/serve/deploy.py +0 -0
  334. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/serve/errors.py +0 -0
  335. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/serve/export.py +0 -0
  336. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/serve/preflight.py +0 -0
  337. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/serve/responses.py +0 -0
  338. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/serve/streaming.py +0 -0
  339. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/serve/thinking.py +0 -0
  340. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/serve/urls.py +0 -0
  341. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/__init__.py +0 -0
  342. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/__main__.py +0 -0
  343. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/app.py +0 -0
  344. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/billing/__init__.py +0 -0
  345. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/billing/charges.py +0 -0
  346. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/billing/retry.py +0 -0
  347. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/__init__.py +0 -0
  348. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/checkpoints.py +0 -0
  349. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/environment_registry.py +0 -0
  350. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/envs.py +0 -0
  351. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/projects.py +0 -0
  352. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/reconcile.py +0 -0
  353. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/repo_cleanup.py +0 -0
  354. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/run_registry.py +0 -0
  355. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/teacher_broker.py +0 -0
  356. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/teacher_errors.py +0 -0
  357. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/domain/teacher_requests.py +0 -0
  358. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/platform/__init__.py +0 -0
  359. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/platform/auth.py +0 -0
  360. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/platform/db.py +0 -0
  361. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/platform/deps.py +0 -0
  362. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/platform/internal_client.py +0 -0
  363. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/platform/locks.py +0 -0
  364. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/platform/runtime.py +0 -0
  365. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/routes/__init__.py +0 -0
  366. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/routes/envs.py +0 -0
  367. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/routes/meta.py +0 -0
  368. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/routes/runs.py +0 -0
  369. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/routes/serving.py +0 -0
  370. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/routes/serving_completion.py +0 -0
  371. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/routes/serving_revisions.py +0 -0
  372. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/routes/serving_smoke.py +0 -0
  373. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/server/routes/teacher.py +0 -0
  374. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/source_snapshot.py +0 -0
  375. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/teacher/__init__.py +0 -0
  376. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/teacher/limits.py +0 -0
  377. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/teacher/provider_status.py +0 -0
  378. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/flash/teacher/retry_contract.py +0 -0
  379. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/scripts/build_dev_dist.py +0 -0
  380. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/scripts/check_file_size.py +0 -0
  381. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/scripts/check_function_size.py +0 -0
  382. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/scripts/check_rollout_identity_actor.py +0 -0
  383. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/scripts/check_verl_pin_exists.py +0 -0
  384. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/scripts/scrub_history.sh +0 -0
  385. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/__init__.py +0 -0
  386. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/_helpers/__init__.py +0 -0
  387. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/_helpers/profile.py +0 -0
  388. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/_helpers/runner.py +0 -0
  389. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/_helpers/source_snapshot.py +0 -0
  390. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/_helpers/specs.py +0 -0
  391. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/_helpers/teacher.py +0 -0
  392. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/_helpers/vast.py +0 -0
  393. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/capture_image_sft_processor_oracle.py +0 -0
  394. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/conftest.py +0 -0
  395. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  396. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/fixtures/qwen35_08b_target_metadata.json +0 -0
  397. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/live/__init__.py +0 -0
  398. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/live/conftest.py +0 -0
  399. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/live/test_lambda_live.py +0 -0
  400. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/live/test_runpod_live.py +0 -0
  401. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/live/test_sft_thinking_render_live.py +0 -0
  402. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/live/test_vast_live.py +0 -0
  403. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_accounting_coverage.py +0 -0
  404. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_adapter_shard_completeness.py +0 -0
  405. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_agent_flash_cli_contract.py +0 -0
  406. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_algorithms.py +0 -0
  407. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_allocator.py +0 -0
  408. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_backend_common.py +0 -0
  409. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_backend_jobspec_contract.py +0 -0
  410. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_bake_kernel_cache.py +0 -0
  411. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_base_model_provenance.py +0 -0
  412. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_billing_retry.py +0 -0
  413. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_build_context_contract.py +0 -0
  414. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cancel_remote.py +0 -0
  415. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_catalog_consistency.py +0 -0
  416. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_catalog_only_models.py +0 -0
  417. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_charge_pricing.py +0 -0
  418. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_checkpoint_lifecycle.py +0 -0
  419. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_checkpoints.py +0 -0
  420. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_commands.py +0 -0
  421. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_commands_coverage.py +0 -0
  422. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_credential_shadowing.py +0 -0
  423. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_errors.py +0 -0
  424. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_estimate.py +0 -0
  425. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_gpus_flag.py +0 -0
  426. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_help.py +0 -0
  427. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_main_coverage.py +0 -0
  428. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_managed.py +0 -0
  429. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_render_coverage.py +0 -0
  430. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_traces.py +0 -0
  431. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cli_wandb_warning.py +0 -0
  432. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_client.py +0 -0
  433. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_client_import_purity.py +0 -0
  434. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_client_server_integration.py +0 -0
  435. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_client_stream_reads.py +0 -0
  436. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_config_env_vars.py +0 -0
  437. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_config_overrides.py +0 -0
  438. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_console_upload.py +0 -0
  439. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_controlled_experiment_repairs.py +0 -0
  440. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cost_analytical.py +0 -0
  441. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cost_equation.py +0 -0
  442. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cost_estimate.py +0 -0
  443. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cost_hardware.py +0 -0
  444. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_cost_models.py +0 -0
  445. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_dataset_profile.py +0 -0
  446. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_deploy_alias_move_warning.py +0 -0
  447. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_deploy_latency.py +0 -0
  448. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_dev_channel.py +0 -0
  449. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_disk_gb.py +0 -0
  450. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_endpoint_name.py +0 -0
  451. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_cache_evict.py +0 -0
  452. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_delete.py +0 -0
  453. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_download.py +0 -0
  454. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_download_api.py +0 -0
  455. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_evaluations.py +0 -0
  456. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_list_api.py +0 -0
  457. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_list_cli.py +0 -0
  458. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_list_hub.py +0 -0
  459. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_no_install.py +0 -0
  460. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_publish.py +0 -0
  461. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_pull.py +0 -0
  462. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_pull_coverage.py +0 -0
  463. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_pull_loader_coverage.py +0 -0
  464. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_pull_managed_control_plane.py +0 -0
  465. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_push.py +0 -0
  466. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_rate_limit_resolve.py +0 -0
  467. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_ref_pinning.py +0 -0
  468. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_env_test.py +0 -0
  469. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_envs_coverage.py +0 -0
  470. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_export.py +0 -0
  471. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_flash_mvp.py +0 -0
  472. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_flash_worker.py +0 -0
  473. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_flashinfer_cache_dirs.py +0 -0
  474. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_freesolo_api_transport.py +0 -0
  475. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_fused_expert_warmstart.py +0 -0
  476. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_github_urlopen_retry.py +0 -0
  477. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_gpu_type_single_field.py +0 -0
  478. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_gpus.py +0 -0
  479. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_grpo_params.py +0 -0
  480. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_grpo_process_census.py +0 -0
  481. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_grpo_resident_sizing.py +0 -0
  482. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_grpo_reward_batching.py +0 -0
  483. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_grpo_rollout_contract.py +0 -0
  484. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_grpo_rollout_identity.py +0 -0
  485. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_health_liveness.py +0 -0
  486. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_hf_retry.py +0 -0
  487. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_idle_endpoint_reaper.py +0 -0
  488. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_image_environment_capability.py +0 -0
  489. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_image_incremental_processor.py +0 -0
  490. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_image_sft_markers.py +0 -0
  491. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_image_sft_processor_parity.py +0 -0
  492. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_image_tokens.py +0 -0
  493. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_infisical_secrets.py +0 -0
  494. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_instance_bootstrap_coverage.py +0 -0
  495. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_internal_client.py +0 -0
  496. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_jobs.py +0 -0
  497. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_kernel_cache.py +0 -0
  498. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_kernel_fingerprint.py +0 -0
  499. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_kv_util.py +0 -0
  500. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_lambda_api_coverage.py +0 -0
  501. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_lambda_runner.py +0 -0
  502. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_logging.py +0 -0
  503. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_login_perms.py +0 -0
  504. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_lora_rank_coverage.py +0 -0
  505. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_lora_rank_nested_rung.py +0 -0
  506. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_lora_rank_preflight.py +0 -0
  507. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_lora_targeting.py +0 -0
  508. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_lora_targeting_pinned_verl.py +0 -0
  509. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_managed_config_fields.py +0 -0
  510. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_managed_hf_repo.py +0 -0
  511. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_metrics_schema_agent_contract.py +0 -0
  512. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_mig_guard.py +0 -0
  513. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_multi_gpu_gate.py +0 -0
  514. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_multimodal_training.py +0 -0
  515. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_named_reward_metrics.py +0 -0
  516. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_oom_escalate_gpu.py +0 -0
  517. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_opd.py +0 -0
  518. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_opd_limits.py +0 -0
  519. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  520. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_opd_multiturn_failure_exit.py +0 -0
  521. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_opd_replay_guard.py +0 -0
  522. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_opd_resume_safety.py +0 -0
  523. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_opd_train.py +0 -0
  524. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_orchestrator_flash.py +0 -0
  525. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_packing.py +0 -0
  526. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_packing_coverage.py +0 -0
  527. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_parasail_teacher.py +0 -0
  528. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_persisted_spec_envelope.py +0 -0
  529. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_poll_helpers.py +0 -0
  530. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_preflight.py +0 -0
  531. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_projects.py +0 -0
  532. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_prompt_budget.py +0 -0
  533. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_provider_preflight_coverage.py +0 -0
  534. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_provider_routing.py +0 -0
  535. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_provider_teardown_robustness.py +0 -0
  536. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_providers_symmetry.py +0 -0
  537. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_realized_cost.py +0 -0
  538. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_repo_cleanup.py +0 -0
  539. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_resolve_params_b.py +0 -0
  540. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_resume_on_retry.py +0 -0
  541. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_rl_train.py +0 -0
  542. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_rollout_samples.py +0 -0
  543. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_runmgmt.py +0 -0
  544. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_runpod_api_delete.py +0 -0
  545. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_runpod_key_fingerprint.py +0 -0
  546. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_runpod_key_waterfall.py +0 -0
  547. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_runtime_capsule.py +0 -0
  548. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_serve.py +0 -0
  549. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_serve_reasoning_content.py +0 -0
  550. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_server_api.py +0 -0
  551. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_server_app_coverage.py +0 -0
  552. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_server_auth_singleflight.py +0 -0
  553. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_server_billing.py +0 -0
  554. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_server_checkpoints_coverage.py +0 -0
  555. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_server_db.py +0 -0
  556. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_server_envs_coverage.py +0 -0
  557. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_server_locks_coverage.py +0 -0
  558. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_server_standalone.py +0 -0
  559. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_serving_context_preflight.py +0 -0
  560. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_serving_contract.py +0 -0
  561. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_serving_schema_coverage.py +0 -0
  562. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_sft_chunked_nll.py +0 -0
  563. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_sft_example_selection.py +0 -0
  564. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_sft_gc_off.py +0 -0
  565. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_sft_max_context.py +0 -0
  566. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_sft_startup_block.py +0 -0
  567. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_sft_train.py +0 -0
  568. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_sft_workload.py +0 -0
  569. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_source_attestation_flow.py +0 -0
  570. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_source_snapshot.py +0 -0
  571. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_spec_and_validation.py +0 -0
  572. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_spec_contract_bytes.py +0 -0
  573. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_staged_environment.py +0 -0
  574. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_step_floor.py +0 -0
  575. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_step_metrics.py +0 -0
  576. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_step_timing.py +0 -0
  577. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_structured_outputs.py +0 -0
  578. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_teacher_broker.py +0 -0
  579. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_teacher_encoding_contract.py +0 -0
  580. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_terminal_artifacts.py +0 -0
  581. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_thinking_config.py +0 -0
  582. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_train_context_preflight.py +0 -0
  583. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_training_controls.py +0 -0
  584. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_type_comment_prose.py +0 -0
  585. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_vast_api.py +0 -0
  586. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_vast_api_coverage.py +0 -0
  587. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_vast_offers.py +0 -0
  588. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_vast_provider_coverage.py +0 -0
  589. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_vast_runner.py +0 -0
  590. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_verified_revisions.py +0 -0
  591. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_verifiers.py +0 -0
  592. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_verl_checkpoint_export.py +0 -0
  593. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_verl_child_plugins.py +0 -0
  594. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_verl_silence_watchdog.py +0 -0
  595. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_version.py +0 -0
  596. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  597. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_vram_architecture.py +0 -0
  598. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_wandb_link.py +0 -0
  599. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_wandb_naming.py +0 -0
  600. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_warmstart_adapter_download.py +0 -0
  601. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_warmstart_cross_repo.py +0 -0
  602. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_warmstart_error_attribution.py +0 -0
  603. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_warmstart_image_adapters.py +0 -0
  604. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_weight_cache.py +0 -0
  605. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_worker_dryrun.py +0 -0
  606. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_worker_hardexit.py +0 -0
  607. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_worker_image.py +0 -0
  608. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_worker_init_heartbeat.py +0 -0
  609. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_worker_stack.py +0 -0
  610. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_worker_thinking.py +0 -0
  611. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_workflow_contracts.py +0 -0
  612. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_workload_profile.py +0 -0
  613. {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.95}/tests/test_zero2_sharding_gate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.2.94
3
+ Version: 1.2.95
4
4
  Summary: Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI
5
5
  Project-URL: Homepage, https://github.com/freesolo-co/flash
6
6
  Project-URL: Repository, https://github.com/freesolo-co/flash
@@ -3,9 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import argparse
6
- import difflib
7
6
  import math
8
- import re
9
7
  import shlex
10
8
  import sys
11
9
  from typing import NoReturn
@@ -57,6 +55,7 @@ from flash.cli.commands.traces import (
57
55
  RECORDS_FORMAT,
58
56
  cmd_traces_export,
59
57
  )
58
+ from flash.cli.errors import friendly_error
60
59
  from flash.cli.ui import render
61
60
  from flash.client.config import shadowed_login_warning
62
61
  from flash.core.catalog import ALGORITHMS
@@ -170,20 +169,6 @@ def _gpu_count_override(value: str) -> str:
170
169
  raise argparse.ArgumentTypeError(f"expected a number of gpus, got {value!r}") from None
171
170
 
172
171
 
173
- def _friendly_message(message: str) -> str:
174
- """Shorten argparse's verbose ``invalid choice: 'x' (choose from a, b, c, ...)`` into a concise
175
- ``unknown command 'x' (did you mean 'y'?)`` — the single closest match instead of dumping the
176
- whole list. Other messages pass through untouched. Styled path only; the machine path keeps
177
- argparse's exact text (scripts and the error tests match on the literal `invalid choice`)."""
178
- m = re.search(r"invalid choice: '([^']*)'(?: \(choose from (.*)\))?", message)
179
- if not m:
180
- return message
181
- bad, raw_choices = m.group(1), m.group(2) or ""
182
- choices = [c.strip().strip("'\"") for c in raw_choices.split(",") if c.strip()]
183
- near = difflib.get_close_matches(bad, choices, n=1)
184
- return f"unknown command '{bad}'" + (f" (did you mean '{near[0]}'?)" if near else "")
185
-
186
-
187
172
  class _ThemedParser(argparse.ArgumentParser):
188
173
  """Base parser whose usage errors match the rest of the themed CLI.
189
174
 
@@ -201,9 +186,13 @@ class _ThemedParser(argparse.ArgumentParser):
201
186
  if not render.styled():
202
187
  super().error(message) # argparse's raw usage + `prog: error: msg`, then exit 2
203
188
  # themed twin: the red ✗ error line (same idiom as main()'s catch-all and `flash login`),
204
- # then a dimmed pointer at this parser's own --help instead of the raw usage block. An
205
- # "invalid choice" becomes a short "did you mean" suggestion (see _friendly_message).
206
- print(render.error(_friendly_message(message)), file=sys.stderr)
189
+ # then a dimmed pointer at this parser's own --help instead of the raw usage block. unknown
190
+ # commands and flags get a short "did you mean" suggestion (see `friendly_error`). the argv
191
+ # stash is what tells it which subcommand was selected; only the root parser carries one.
192
+ print(
193
+ render.error(friendly_error(message, self, getattr(self, "_flash_argv", None))),
194
+ file=sys.stderr,
195
+ )
207
196
  # dimmed pointer at THIS parser's own --help (argparse sets prog per parser: `flash --help`
208
197
  # for the root, `flash <cmd> --help` for a subcommand) instead of the raw usage block.
209
198
  print(render.arrow(f"run `{self.prog} --help` for usage"), file=sys.stderr)
@@ -902,6 +891,12 @@ def _redacted_args(raw_args: list[str]) -> list[str]:
902
891
  def main(argv: list[str] | None = None) -> int:
903
892
  raw_args = list(argv) if argv is not None else sys.argv[1:]
904
893
  parser = _build_parser()
894
+ # the tokens this invocation was actually given, for the error hook: argparse reports a
895
+ # subcommand's unknown flags from the ROOT parser, so scoping the suggestion to the selected
896
+ # command needs the argv `main` was called with. reading sys.argv there instead would be right
897
+ # only for the console-script path and wrong for every embedded caller -- including the tests,
898
+ # where it silently reads pytest's own argv and restores the whole-tree pool.
899
+ parser._flash_argv = raw_args
905
900
  args = parser.parse_args(argv)
906
901
  configure_logging(verbosity=getattr(args, "verbose", 0))
907
902
  debug = getattr(args, "debug", False)
@@ -0,0 +1,277 @@
1
+ """Turning argparse's usage errors into the themed CLI's short suggestions.
2
+
3
+ argparse reports a mistyped flag by printing the whole usage block, which buries the one token that
4
+ was actually wrong. These helpers reduce that to a single line naming the token and, where one
5
+ exists, the closest real alternative.
6
+
7
+ The hard part is making the suggestion one the user can actually follow. A subcommand's unknown
8
+ tokens are handed back to the root parser to report, so candidate options must be recovered from the
9
+ parser in effect at the rejected token's argv position. Looking only at the final selected command
10
+ crosses nested command boundaries, while looking through the whole tree offers unrelated flags.
11
+
12
+ Root flags are also positional here (`flash --debug login`, never `flash login --debug`), and `--`
13
+ stops option parsing. The suggestion context therefore carries both boundaries, plus the original
14
+ spelling of a repeated short root flag that must be moved without changing its count.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import argparse
20
+ import difflib
21
+ import re
22
+ from collections.abc import Iterable
23
+ from dataclasses import dataclass
24
+
25
+ from flash._internal.channel import CLI_NAME
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ class _SuggestionContext:
30
+ options: tuple[str, ...]
31
+ root_only: frozenset[str]
32
+ reposition: str | None = None
33
+ after_terminator: bool = False
34
+
35
+
36
+ def friendly_error(
37
+ message: str, parser: argparse.ArgumentParser, argv: Iterable[str] | None
38
+ ) -> str:
39
+ """Rewrite one argparse usage error for the themed CLI.
40
+
41
+ The whole suggestion policy lives behind this call: which parser's flags are candidates, which
42
+ of them need repositioning, and how the message reads. The caller is an ``error()`` override on
43
+ every parser in the tree and should stay a two-liner -- deciding a candidate pool inline there
44
+ would put policy in a hook that exists to print.
45
+ """
46
+ if argv is None:
47
+ # a subparser raising its own error is already the parser in effect at the rejected token.
48
+ context = _SuggestionContext(tuple(sorted(_direct_options(parser))), frozenset())
49
+ else:
50
+ context = _suggestion_context(message, parser, tuple(argv))
51
+ return _friendly_message(message, context)
52
+
53
+
54
+ def _friendly_message(message: str, context: _SuggestionContext) -> str:
55
+ """Shorten argparse's verbose errors into concise suggestions on the styled path.
56
+
57
+ An ``invalid choice: 'x' (choose from a, b, c, ...)`` becomes ``unknown command 'x' (did you
58
+ mean 'y'?)`` instead of dumping the whole list. An ``unrecognized arguments: --flag value``
59
+ suggests the closest option registered on the parser that rejected it. Other messages pass
60
+ through untouched. The machine path keeps argparse's exact text for scripts and error tests.
61
+ """
62
+ m = re.search(r"invalid choice: '([^']*)'(?: \(choose from (.*)\))?", message)
63
+ if m:
64
+ bad, raw_choices = m.group(1), m.group(2) or ""
65
+ choices = [c.strip().strip("'\"") for c in raw_choices.split(",") if c.strip()]
66
+ near = difflib.get_close_matches(bad, choices, n=1)
67
+ return f"unknown command '{bad}'" + (f" (did you mean '{near[0]}'?)" if near else "")
68
+
69
+ prefix = "unrecognized arguments: "
70
+ if not message.startswith(prefix):
71
+ return message
72
+ # a bare `-` starts with a dash but names no option, so it is an ordinary positional argparse
73
+ # could not place. requiring a character after the dash keeps it out of the typo machinery,
74
+ # which would otherwise answer it with the nearest short flag.
75
+ bad = next(
76
+ (
77
+ token.split("=", 1)[0]
78
+ for token in message[len(prefix) :].split()
79
+ if token.startswith("-") and len(token.split("=", 1)[0]) > 1
80
+ ),
81
+ None,
82
+ )
83
+ if bad is None:
84
+ return message
85
+ if context.after_terminator:
86
+ return message
87
+ # a root flag in the wrong position is a placement error, not a typo. repeatable short flags
88
+ # retain the complete spelling so moving `-vv` never downgrades it to one `-v`.
89
+ if context.reposition is not None:
90
+ return _reposition_message(context.reposition)
91
+ if bad in context.root_only:
92
+ return _reposition_message(bad)
93
+ # the position-scoped pool can still include an exact spelling shared with the root. dropping it
94
+ # keeps a rejected token from being echoed back as its own correction.
95
+ candidates = [option for option in context.options if option != bad]
96
+ near = difflib.get_close_matches(bad, candidates, n=1)
97
+ if not near:
98
+ return message
99
+ suggestion = near[0]
100
+ if suggestion in context.root_only:
101
+ # a root flag only parses before the subcommand, so naming it alone hands back a correction
102
+ # that fails the same way. say where it goes, or the second attempt is the first error again.
103
+ return f"unrecognized argument '{bad}' (did you mean '{suggestion}'? {_placement_hint(suggestion)})"
104
+ return f"unrecognized argument '{bad}' (did you mean '{suggestion}'?)"
105
+
106
+
107
+ def _placement_hint(flag: str) -> str:
108
+ """Say where a root flag belongs, and claim nothing about the rest of the line.
109
+
110
+ This hint knows one thing: the flag parses only ahead of the subcommand. It does not know what
111
+ removing the flag from where it sat exposes. `--wait` takes an optional value, so a flag lifted
112
+ from between `--wait` and a run id leaves the run id to be swallowed as the timeout -- which
113
+ `_wait_seconds` then catches and explains precisely. Stating the destination and stopping there
114
+ keeps this hint true for every line; the one case it cannot see already answers itself.
115
+
116
+ Both the repositioning message and the respelling-plus-repositioning message end in this same
117
+ advice, so they share it rather than each spelling it out and drifting apart.
118
+ """
119
+ return f"it goes before the command, as `{CLI_NAME} {flag} ...`"
120
+
121
+
122
+ def _reposition_message(flag: str) -> str:
123
+ """Answer a correctly spelled root flag that landed after the subcommand."""
124
+ return f"unrecognized argument '{flag}' ({_placement_hint(flag)})"
125
+
126
+
127
+ def _suggestion_context(
128
+ message: str, root: argparse.ArgumentParser, argv: tuple[str, ...]
129
+ ) -> _SuggestionContext:
130
+ root_only = _root_only_options(root)
131
+ bad = _unrecognized_option(message)
132
+ if bad is None:
133
+ return _SuggestionContext((), root_only)
134
+ location = _option_location(root, argv, bad)
135
+ if location is None:
136
+ return _SuggestionContext((), root_only)
137
+ current, after_terminator = location
138
+ reposition = bad if _is_repeated_root_short_option(root, bad, root_only) else None
139
+ options = tuple(sorted({*_direct_options(current), *root_only}))
140
+ return _SuggestionContext(options, root_only, reposition, after_terminator)
141
+
142
+
143
+ def _unrecognized_option(message: str) -> str | None:
144
+ prefix = "unrecognized arguments: "
145
+ if not message.startswith(prefix):
146
+ return None
147
+ return next(
148
+ (
149
+ token.split("=", 1)[0]
150
+ for token in message[len(prefix) :].split()
151
+ if token.startswith("-")
152
+ ),
153
+ None,
154
+ )
155
+
156
+
157
+ def _option_location(
158
+ root: argparse.ArgumentParser, argv: tuple[str, ...], bad: str
159
+ ) -> tuple[argparse.ArgumentParser, bool] | None:
160
+ """Return the parser and terminator state at the rejected token's argv position."""
161
+ current = root
162
+ path_open = True
163
+ after_terminator = False
164
+ fallback: tuple[argparse.ArgumentParser, bool] | None = None
165
+
166
+ for token in argv:
167
+ if token == "--":
168
+ after_terminator = True
169
+ path_open = False
170
+ continue
171
+ if token.split("=", 1)[0] == bad:
172
+ location = (current, after_terminator)
173
+ fallback = location
174
+ # repeated spellings can include one accepted root occurrence and one rejected
175
+ # subcommand occurrence. choose the occurrence argparse could not consume here.
176
+ if after_terminator or len(_option_tuples(current, token)) != 1:
177
+ return location
178
+ if after_terminator or token.startswith("-") or not path_open:
179
+ continue
180
+ subparsers = next(
181
+ (a for a in current._actions if isinstance(a, argparse._SubParsersAction)), None
182
+ )
183
+ if subparsers is None:
184
+ path_open = False
185
+ continue
186
+ nxt = subparsers.choices.get(token)
187
+ if nxt is None:
188
+ path_open = False
189
+ continue
190
+ current = nxt
191
+
192
+ return fallback
193
+
194
+
195
+ def _option_tuples(parser: argparse.ArgumentParser, token: str) -> list:
196
+ """The prefix matches for a token, for tokens argparse's own helper cannot be asked about.
197
+
198
+ `_get_option_tuples` indexes the token's second character, so a bare ``-`` raises IndexError
199
+ there. A lone dash is an ordinary unrecognized positional and must reach argparse's own message
200
+ rather than crash the code that was trying to improve it.
201
+ """
202
+ if len(token) < 2:
203
+ return []
204
+ return parser._get_option_tuples(token)
205
+
206
+
207
+ def _parse_optional_fields(
208
+ parser: argparse.ArgumentParser, token: str
209
+ ) -> tuple[object, str | None, str | None] | None:
210
+ """The action, option spelling and explicit remainder argparse reads out of a token.
211
+
212
+ `_parse_optional` has three shapes across the interpreters `requires-python` admits: a 3-tuple
213
+ before 3.11.9/3.12.3, a 4-tuple once a separator was inserted, and from 3.12.11 a LIST of those
214
+ tuples, one per prefix match. Normalizing here keeps that churn in one place, and keeps the
215
+ separator out of the caller: the exact-spelling reconstruction the caller does already settles
216
+ what the separator would have told it. An unfamiliar shape returns None rather than raising,
217
+ because this runs inside the handler whose whole job is to render someone else's error.
218
+ """
219
+ parsed = parser._parse_optional(token)
220
+ if isinstance(parsed, list):
221
+ # several prefix matches means the spelling is ambiguous, so it is not one repeated flag.
222
+ parsed = parsed[0] if len(parsed) == 1 else None
223
+ if not isinstance(parsed, tuple) or len(parsed) not in (3, 4):
224
+ return None
225
+ return parsed[0], parsed[1], parsed[-1]
226
+
227
+
228
+ def _is_repeated_root_short_option(
229
+ root: argparse.ArgumentParser, token: str, root_only: frozenset[str]
230
+ ) -> bool:
231
+ """Whether token is a compact repeat of a count-style root option, such as ``-vv``."""
232
+ if not token.startswith("-") or token.startswith("--"):
233
+ return False
234
+ fields = _parse_optional_fields(root, token)
235
+ if fields is None:
236
+ return False
237
+ action, option, explicit = fields
238
+ return (
239
+ isinstance(action, argparse._CountAction)
240
+ and option in root_only
241
+ and isinstance(explicit, str)
242
+ and bool(explicit)
243
+ # the whole token must be that one short flag repeated, so `-vx` and `-v=2` are not repeats.
244
+ and token == option + option[-1] * len(explicit)
245
+ )
246
+
247
+
248
+ def _direct_options(parser: argparse.ArgumentParser) -> Iterable[str]:
249
+ for action in parser._actions:
250
+ yield from action.option_strings
251
+
252
+
253
+ def _parser_options(parser: argparse.ArgumentParser) -> Iterable[str]:
254
+ """Yield option strings registered on a parser and its subparsers."""
255
+ yield from _direct_options(parser)
256
+ for action in parser._actions:
257
+ if isinstance(action, argparse._SubParsersAction):
258
+ for subparser in action.choices.values():
259
+ yield from _parser_options(subparser)
260
+
261
+
262
+ def _root_only_options(parser: argparse.ArgumentParser) -> frozenset[str]:
263
+ """Option strings accepted only BEFORE the subcommand.
264
+
265
+ This CLI's root flags are positional: `flash --debug login` parses, `flash login --debug` does
266
+ not. A suggestion drawn from the whole option pool can therefore name a real flag that still
267
+ fails in the position the user typed it, so the caller needs to know which ones to reposition.
268
+ """
269
+ root: set[str] = set()
270
+ sub: set[str] = set()
271
+ for action in parser._actions:
272
+ if isinstance(action, argparse._SubParsersAction):
273
+ for subparser in action.choices.values():
274
+ sub.update(_parser_options(subparser))
275
+ else:
276
+ root.update(action.option_strings)
277
+ return frozenset(root - sub)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash-dev"
3
- version = "1.2.94"
3
+ version = "1.2.95"
4
4
  description ="Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI"
5
5
  readme = "README.md"
6
6
  # RunPod Flash supports Python 3.11-3.12 (not 3.13 yet).
@@ -137,7 +137,7 @@ artifacts = ["flash/py.typed"]
137
137
  # auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
138
138
  # PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
139
139
  # dev-channel release = bump this (and [project].version) and merge to `dev`.
140
- version = "1.2.94"
140
+ version = "1.2.95"
141
141
 
142
142
  [tool.pytest.ini_options]
143
143
  pythonpath = ["."]
@@ -6,6 +6,7 @@ scripts, and the trainer agent depend on.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
+ import argparse
9
10
  import json
10
11
 
11
12
  import pytest
@@ -454,7 +455,7 @@ def test_invalid_command_suggests_closest_match(monkeypatch, capsys) -> None:
454
455
  cli.main(["models", "deploly"]) # a typo of canonical `models deploy`
455
456
  assert excinfo.value.code == 2
456
457
  err = capsys.readouterr().err
457
- assert "did you mean 'deploy'?" in err
458
+ assert "unknown command 'deploly' (did you mean 'deploy'?)" in err
458
459
  assert "choose from" not in err # the full choice list is gone on a TTY
459
460
  assert "--help" in err
460
461
 
@@ -467,6 +468,234 @@ def test_invalid_command_suggests_closest_match(monkeypatch, capsys) -> None:
467
468
  assert "choose from" in err # the full argparse list stays on the machine path
468
469
 
469
470
 
471
+ @pytest.mark.parametrize("bad_args", [["--key", "X"], ["--key=X"]])
472
+ def test_invalid_login_flag_suggests_api_key(monkeypatch, capsys, bad_args) -> None:
473
+ monkeypatch.setenv("FLASH_STYLE", "1")
474
+ monkeypatch.setenv("NO_COLOR", "1")
475
+
476
+ with pytest.raises(SystemExit) as excinfo:
477
+ cli.main(["login", *bad_args])
478
+ assert excinfo.value.code == 2
479
+ err = capsys.readouterr().err
480
+ assert "unrecognized argument '--key' (did you mean '--api-key'?)" in err
481
+ assert "--help" in err
482
+
483
+
484
+ def test_invalid_flag_machine_path_keeps_argparse_message(monkeypatch, capsys) -> None:
485
+ monkeypatch.setenv("FLASH_STYLE", "0")
486
+
487
+ with pytest.raises(SystemExit) as excinfo:
488
+ cli.main(["login", "--key", "X"])
489
+ assert excinfo.value.code == 2
490
+ err = capsys.readouterr().err
491
+ assert "error: unrecognized arguments: --key X" in err
492
+ assert "did you mean" not in err
493
+
494
+
495
+ def test_invalid_flag_without_close_match_keeps_original_message(monkeypatch, capsys) -> None:
496
+ monkeypatch.setenv("FLASH_STYLE", "1")
497
+ monkeypatch.setenv("NO_COLOR", "1")
498
+
499
+ with pytest.raises(SystemExit) as excinfo:
500
+ cli.main(["login", "--xyzzy", "X"])
501
+ assert excinfo.value.code == 2
502
+ err = capsys.readouterr().err
503
+ assert "unrecognized arguments: --xyzzy X" in err
504
+ assert "did you mean" not in err
505
+
506
+
507
+ def test_flag_valid_on_another_command_is_not_suggested_to_itself(monkeypatch, capsys) -> None:
508
+ # --repository is real on `models export`, so the cross-subcommand candidate pool contains it
509
+ # and the closest match to '--repository' is itself. echoing the rejected token back as its own
510
+ # correction reads as a bug in the cli, so no suggestion is better than that one.
511
+ monkeypatch.setenv("FLASH_STYLE", "1")
512
+ monkeypatch.setenv("NO_COLOR", "1")
513
+
514
+ with pytest.raises(SystemExit) as excinfo:
515
+ cli.main(["login", "--repository", "X"])
516
+ assert excinfo.value.code == 2
517
+ err = capsys.readouterr().err
518
+ assert "unrecognized arguments: --repository X" in err
519
+ assert "did you mean '--repository'" not in err
520
+
521
+
522
+ def test_a_root_flag_suggestion_says_where_the_flag_goes(monkeypatch, capsys) -> None:
523
+ """A correction the user cannot follow is not a correction.
524
+
525
+ Root flags parse only before the subcommand, so `flash login --verbos` -> "did you mean
526
+ '--verbose'?" sends the user to `flash login --verbose`, which fails identically. The suggestion
527
+ has to carry the position, since that is the actual difference between working and not.
528
+ """
529
+ monkeypatch.setenv("FLASH_STYLE", "1")
530
+ monkeypatch.setenv("NO_COLOR", "1")
531
+
532
+ with pytest.raises(SystemExit) as excinfo:
533
+ cli.main(["login", "--verbos"])
534
+ assert excinfo.value.code == 2
535
+ err = capsys.readouterr().err
536
+ assert "did you mean '--verbose'" in err
537
+ assert "it goes before the command" in err
538
+ assert "flash --verbose ..." in err
539
+
540
+
541
+ def test_a_subcommand_flag_suggestion_is_not_given_a_reposition_hint(monkeypatch, capsys) -> None:
542
+ """Only root-only flags need repositioning; a subcommand's own flag is already in place."""
543
+ monkeypatch.setenv("FLASH_STYLE", "1")
544
+ monkeypatch.setenv("NO_COLOR", "1")
545
+
546
+ with pytest.raises(SystemExit) as excinfo:
547
+ cli.main(["runs", "log", "flash-1", "--folow"])
548
+ assert excinfo.value.code == 2
549
+ err = capsys.readouterr().err
550
+ assert "did you mean '--follow'" in err
551
+ assert "it goes before the command" not in err
552
+
553
+
554
+ @pytest.mark.parametrize(
555
+ ("argv", "absent"),
556
+ [
557
+ # --follow is real on `runs log`, not on `login`; --api-key is real on `login`, not here.
558
+ (["login", "--folow"], "--follow"),
559
+ (["runs", "log", "flash-1", "--api-ke"], "--api-key"),
560
+ ],
561
+ )
562
+ def test_a_flag_from_an_unrelated_command_is_not_suggested(
563
+ monkeypatch, capsys, argv, absent
564
+ ) -> None:
565
+ """A suggestion the user cannot follow is worse than none.
566
+
567
+ The candidate pool has to span subcommands for a suggestion to be reachable at all, since
568
+ argparse reports a subcommand's unknown tokens from the root. Drawing from the WHOLE tree
569
+ though offers flags that belong to some other command, so the corrected line is rejected
570
+ exactly like the first one and the hint has cost the user a round trip.
571
+ """
572
+ monkeypatch.setenv("FLASH_STYLE", "1")
573
+ monkeypatch.setenv("NO_COLOR", "1")
574
+
575
+ with pytest.raises(SystemExit) as excinfo:
576
+ cli.main(argv)
577
+ assert excinfo.value.code == 2
578
+ err = capsys.readouterr().err
579
+ assert absent not in err
580
+ assert "did you mean" not in err
581
+
582
+
583
+ def test_a_correctly_spelled_root_flag_is_repositioned_not_respelled(monkeypatch, capsys) -> None:
584
+ """`--verbose` after a command is a placement error, so there is nothing to correct it to.
585
+
586
+ Dropping the exact token from the pool is what keeps a typo from being echoed back as its own
587
+ fix, but it also removes `--verbose` here and lets the nearest sibling stand in: the answer was
588
+ "did you mean '--version'?", a different flag with a different meaning.
589
+ """
590
+ monkeypatch.setenv("FLASH_STYLE", "1")
591
+ monkeypatch.setenv("NO_COLOR", "1")
592
+
593
+ with pytest.raises(SystemExit) as excinfo:
594
+ cli.main(["train", "x.toml", "--verbose"])
595
+ assert excinfo.value.code == 2
596
+ err = capsys.readouterr().err
597
+ assert "it goes before the command" in err
598
+ assert "flash --verbose ..." in err
599
+ assert "--version" not in err
600
+
601
+
602
+ def test_nested_flag_typo_is_scoped_to_parser_at_its_position(monkeypatch, capsys) -> None:
603
+ monkeypatch.setenv("FLASH_STYLE", "1")
604
+ monkeypatch.setenv("NO_COLOR", "1")
605
+
606
+ with pytest.raises(SystemExit) as excinfo:
607
+ cli.main(["runs", "--folow", "log", "flash-1"])
608
+ assert excinfo.value.code == 2
609
+ err = capsys.readouterr().err
610
+ assert "unrecognized arguments: --folow" in err
611
+ assert "--follow" not in err
612
+ assert "did you mean" not in err
613
+
614
+
615
+ def test_repeated_short_root_flag_is_repositioned_without_downgrading(monkeypatch, capsys) -> None:
616
+ monkeypatch.setenv("FLASH_STYLE", "1")
617
+ monkeypatch.setenv("NO_COLOR", "1")
618
+
619
+ with pytest.raises(SystemExit) as excinfo:
620
+ cli.main(["login", "-vv"])
621
+ assert excinfo.value.code == 2
622
+ err = capsys.readouterr().err
623
+ assert "unrecognized argument '-vv'" in err
624
+ assert "it goes before the command" in err
625
+ assert "flash -vv ..." in err
626
+ assert "flash -v ..." not in err
627
+
628
+
629
+ def test_flag_typo_after_option_terminator_has_no_unusable_suggestion(monkeypatch, capsys) -> None:
630
+ monkeypatch.setenv("FLASH_STYLE", "1")
631
+ monkeypatch.setenv("NO_COLOR", "1")
632
+
633
+ with pytest.raises(SystemExit) as excinfo:
634
+ cli.main(["runs", "log", "flash-1", "--", "--folow"])
635
+ assert excinfo.value.code == 2
636
+ err = capsys.readouterr().err
637
+ assert "unrecognized arguments: --folow" in err
638
+ assert "--follow" not in err
639
+ assert "did you mean" not in err
640
+
641
+
642
+ def test_a_lone_dash_reaches_argparses_own_message(monkeypatch, capsys) -> None:
643
+ """A bare `-` names no option, so the typo machinery must not answer it with a flag.
644
+
645
+ `_get_option_tuples` indexes the token's second character, so asking argparse about a lone dash
646
+ raised IndexError from inside the handler whose whole job is to improve an error message.
647
+ """
648
+ monkeypatch.setenv("FLASH_STYLE", "1")
649
+ monkeypatch.setenv("NO_COLOR", "1")
650
+
651
+ with pytest.raises(SystemExit) as excinfo:
652
+ cli.main(["runs", "log", "flash-1", "-"])
653
+ assert excinfo.value.code == 2
654
+ err = capsys.readouterr().err
655
+ assert "unrecognized arguments: -" in err
656
+ assert "did you mean" not in err
657
+ assert "-v" not in err
658
+
659
+
660
+ @pytest.mark.parametrize("shape", ["tuple3", "tuple4", "list"])
661
+ def test_a_repeated_short_root_flag_is_recognized_under_every_parse_optional_shape(
662
+ monkeypatch, shape
663
+ ) -> None:
664
+ """`_parse_optional` has three shapes across the interpreters `requires-python` admits.
665
+
666
+ A 3-tuple before 3.11.9/3.12.3, a 4-tuple after the separator was inserted, and from 3.12.11
667
+ a LIST of those tuples. Each one has broken this predicate in a different way: the 4-tuple
668
+ unpack raised ValueError on the older interpreters, and the arity guard written for both
669
+ tuples silently rejected the list, which put `-vv` back on the path that downgrades it to `-v`.
670
+
671
+ The predicate is exercised directly rather than through `cli.main`, because argparse's own
672
+ parse loop reads this same value: reshaping it parser-wide fails inside argparse and would
673
+ prove nothing about our handling.
674
+ """
675
+ from flash.cli.errors import _is_repeated_root_short_option
676
+
677
+ root = argparse.ArgumentParser()
678
+ root.add_argument("-v", action="count")
679
+ original = root._parse_optional
680
+
681
+ def reshaped(arg_string):
682
+ parsed = original(arg_string)
683
+ if isinstance(parsed, list): # normalize the interpreter's own shape away first
684
+ parsed = parsed[0] if len(parsed) == 1 else None
685
+ if parsed is None:
686
+ return None
687
+ if shape == "tuple3": # drop the separator argparse inserted at index 2
688
+ return (parsed[0], parsed[1], parsed[3]) if len(parsed) == 4 else parsed
689
+ if shape == "list":
690
+ return [parsed]
691
+ return parsed
692
+
693
+ monkeypatch.setattr(root, "_parse_optional", reshaped)
694
+ assert _is_repeated_root_short_option(root, "-vv", frozenset({"-v"})) is True
695
+ # a short flag that is not a repeat of itself must not be repositioned as one.
696
+ assert _is_repeated_root_short_option(root, "-vx", frozenset({"-v"})) is False
697
+
698
+
470
699
  def test_theme_light_and_dark_use_different_brand_colors(monkeypatch) -> None:
471
700
  monkeypatch.setenv("FLASH_STYLE", "1")
472
701
  monkeypatch.setenv("COLORTERM", "truecolor")
@@ -1052,7 +1052,7 @@ wheels = [
1052
1052
 
1053
1053
  [[package]]
1054
1054
  name = "freesolo-flash"
1055
- version = "1.2.94"
1055
+ version = "1.2.95"
1056
1056
  source = { editable = "." }
1057
1057
 
1058
1058
  [package.optional-dependencies]