freesolo-flash-dev 1.2.67__tar.gz → 1.2.68__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 (587) hide show
  1. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/push.py +14 -1
  3. freesolo_flash_dev-1.2.68/flash/envs/package/direct_tokens.py +136 -0
  4. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/envs.py +9 -0
  5. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/pyproject.toml +2 -2
  6. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_publish.py +87 -0
  7. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_push.py +198 -0
  8. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/uv.lock +1 -1
  9. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.dockerignore +0 -0
  10. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.env.example +0 -0
  11. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/CODEOWNERS +0 -0
  12. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  13. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  14. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  15. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/dependabot.yml +0 -0
  17. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/workflows/auto-rebake.yml +0 -0
  18. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/workflows/bake-kernel-cache.yml +0 -0
  19. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/workflows/ci.yml +0 -0
  20. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/workflows/main-source-guard.yml +0 -0
  21. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/workflows/notify-tests-repo.yml +0 -0
  22. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/workflows/publish-dev.yml +0 -0
  23. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/workflows/publish-image.yml +0 -0
  24. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/workflows/publish.yml +0 -0
  25. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/workflows/version-parity.yml +0 -0
  26. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.github/workflows/worker-image.yml +0 -0
  27. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/.gitignore +0 -0
  28. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/CHANGELOG.md +0 -0
  29. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/CODE_OF_CONDUCT.md +0 -0
  30. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/CONTRIBUTING.md +0 -0
  31. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/Dockerfile +0 -0
  32. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/Dockerfile.worker +0 -0
  33. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/LICENSE +0 -0
  34. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/NOTICE +0 -0
  35. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/README.md +0 -0
  36. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/SECURITY.md +0 -0
  37. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/SELF_HOSTING.md +0 -0
  38. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/build/kernel_cache/.gitignore +0 -0
  39. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/build/kernel_cache/.keep +0 -0
  40. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/deploy/infisical/README.md +0 -0
  41. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/deploy/infisical/entrypoint.sh +0 -0
  42. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/docker/Dockerfile.kernelcache +0 -0
  43. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/docker/Dockerfile.kernelcache.relayer +0 -0
  44. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/docker/bake_kernel_cache.py +0 -0
  45. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/docker/bake_pod_entry.py +0 -0
  46. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/docker/extract_cudart_fix.py +0 -0
  47. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/docker/kernel_fingerprint.py +0 -0
  48. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/docker/make_rp_handler.py +0 -0
  49. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/__init__.py +0 -0
  50. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/_internal/__init__.py +0 -0
  51. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/_internal/channel.py +0 -0
  52. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/_internal/diagnostics.py +0 -0
  53. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/_internal/fileio.py +0 -0
  54. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/_internal/logging.py +0 -0
  55. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/_internal/paths.py +0 -0
  56. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/adapters/__init__.py +0 -0
  57. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/adapters/artifacts.py +0 -0
  58. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/adapters/fused_experts.py +0 -0
  59. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/adapters/lora_rank.py +0 -0
  60. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/__init__.py +0 -0
  61. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/__main__.py +0 -0
  62. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/__init__.py +0 -0
  63. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/deploy.py +0 -0
  64. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/__init__.py +0 -0
  65. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/episode.py +0 -0
  66. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/eval.py +0 -0
  67. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/eval_args.py +0 -0
  68. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/imports.py +0 -0
  69. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/list.py +0 -0
  70. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/retained.py +0 -0
  71. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/setup.py +0 -0
  72. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/setup_wandb.py +0 -0
  73. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/test.py +0 -0
  74. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/test_evaluations.py +0 -0
  75. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/test_params.py +0 -0
  76. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/env/test_warnings.py +0 -0
  77. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/prompt_budget.py +0 -0
  78. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/traces.py +0 -0
  79. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/commands/train_cost.py +0 -0
  80. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/scaffold/TRAINING.md +0 -0
  81. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/scaffold/__init__.py +0 -0
  82. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/ui/__init__.py +0 -0
  83. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/ui/cost.py +0 -0
  84. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/ui/env_panels.py +0 -0
  85. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/ui/heartbeat.py +0 -0
  86. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/ui/render.py +0 -0
  87. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/ui/tables.py +0 -0
  88. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cli/ui/tty.py +0 -0
  89. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/client/__init__.py +0 -0
  90. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/client/config.py +0 -0
  91. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/client/freesolo_api.py +0 -0
  92. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/client/http.py +0 -0
  93. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/client/runtime_secrets.py +0 -0
  94. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/client/shapes.py +0 -0
  95. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/client/specs.py +0 -0
  96. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/client/streaming.py +0 -0
  97. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/content/__init__.py +0 -0
  98. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/content/multimodal.py +0 -0
  99. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/content/structured_outputs.py +0 -0
  100. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/content/thinking.py +0 -0
  101. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/core/__init__.py +0 -0
  102. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/core/catalog.py +0 -0
  103. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/core/spec.py +0 -0
  104. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/core/spec_persistence.py +0 -0
  105. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cost/__init__.py +0 -0
  106. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cost/analytical.py +0 -0
  107. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cost/facts.py +0 -0
  108. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cost/spec.py +0 -0
  109. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/cost/types.py +0 -0
  110. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/__init__.py +0 -0
  111. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/huggingface.py +0 -0
  112. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/plan/__init__.py +0 -0
  113. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/plan/kv_sizing.py +0 -0
  114. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/plan/model_config_probe.py +0 -0
  115. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/plan/prompt_budget.py +0 -0
  116. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/plan/recipe.py +0 -0
  117. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/plan/steps.py +0 -0
  118. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/plan/vram.py +0 -0
  119. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/profiling/__init__.py +0 -0
  120. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/profiling/dataset_profile.py +0 -0
  121. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/profiling/image_tokens.py +0 -0
  122. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/profiling/reasoning_render.py +0 -0
  123. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/profiling/sft_image_rows.py +0 -0
  124. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/profiling/sft_workload.py +0 -0
  125. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/profiling/tokenizer.py +0 -0
  126. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/profiling/workload_profile.py +0 -0
  127. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/result/__init__.py +0 -0
  128. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/result/accounting.py +0 -0
  129. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/result/rollout_samples.py +0 -0
  130. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/__init__.py +0 -0
  131. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/__main__.py +0 -0
  132. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/backend_common.py +0 -0
  133. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/entry/__init__.py +0 -0
  134. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/entry/opd.py +0 -0
  135. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/entry/rl.py +0 -0
  136. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/entry/sft.py +0 -0
  137. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/io/__init__.py +0 -0
  138. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/io/heartbeat.py +0 -0
  139. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/io/hf.py +0 -0
  140. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/io/prefetch.py +0 -0
  141. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/io/wandb_log.py +0 -0
  142. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/model/__init__.py +0 -0
  143. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/model/adapter.py +0 -0
  144. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/model/chatml_mask.py +0 -0
  145. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/model/decoding.py +0 -0
  146. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/model/lora.py +0 -0
  147. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/model/packing.py +0 -0
  148. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/opd_train.py +0 -0
  149. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/opd_train_runner.py +0 -0
  150. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/perf/__init__.py +0 -0
  151. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/perf/diagnostics.py +0 -0
  152. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/perf/lifecycle.py +0 -0
  153. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/perf/liger.py +0 -0
  154. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/perf/memory.py +0 -0
  155. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/rl_train.py +0 -0
  156. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/rl_train_runner.py +0 -0
  157. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/runtime/__init__.py +0 -0
  158. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  159. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  160. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/runtime/rng.py +0 -0
  161. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/score_batcher.py +0 -0
  162. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/sft_train.py +0 -0
  163. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/sft_train_runner.py +0 -0
  164. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/teacher/__init__.py +0 -0
  165. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/teacher/client.py +0 -0
  166. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/teacher/encoding.py +0 -0
  167. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  168. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/__init__.py +0 -0
  169. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/core/__init__.py +0 -0
  170. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  171. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/core/child/__init__.py +0 -0
  172. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/core/child/glue.py +0 -0
  173. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/core/child/runtime.py +0 -0
  174. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/core/step_timing.py +0 -0
  175. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/finalize.py +0 -0
  176. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/__init__.py +0 -0
  177. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/batching.py +0 -0
  178. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/bridge.py +0 -0
  179. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
  180. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  181. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  182. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/child/entry.py +0 -0
  183. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  184. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  185. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  186. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  187. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/child/structured.py +0 -0
  188. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/failures.py +0 -0
  189. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/gkd.py +0 -0
  190. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  191. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/overrides.py +0 -0
  192. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/prompts.py +0 -0
  193. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/reporting.py +0 -0
  194. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/scoring.py +0 -0
  195. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/state.py +0 -0
  196. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/opd/validation.py +0 -0
  197. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/__init__.py +0 -0
  198. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  199. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  200. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/child/entry.py +0 -0
  201. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  202. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/child/patches.py +0 -0
  203. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  204. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/config.py +0 -0
  205. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/inputs.py +0 -0
  206. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  207. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/reward_module.py +0 -0
  208. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/scoring.py +0 -0
  209. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/single_turn.py +0 -0
  210. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/rl/verl_config.py +0 -0
  211. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/sft/__init__.py +0 -0
  212. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  213. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/sft/child/entry.py +0 -0
  214. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  215. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/train/sft/config.py +0 -0
  216. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/verl/__init__.py +0 -0
  217. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/verl/capabilities.py +0 -0
  218. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/verl/checkpoints.py +0 -0
  219. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/verl/child_io.py +0 -0
  220. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/verl/diagnostics.py +0 -0
  221. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/verl/parallelism.py +0 -0
  222. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker/verl/parent_work.py +0 -0
  223. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/engine/worker_entrypoint.py +0 -0
  224. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/__init__.py +0 -0
  225. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/adapter.py +0 -0
  226. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/base.py +0 -0
  227. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/cache_security.py +0 -0
  228. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/dataset_selection.py +0 -0
  229. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/evaluations.py +0 -0
  230. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/identity.py +0 -0
  231. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/loader.py +0 -0
  232. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/namespace_listing.py +0 -0
  233. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/package/__init__.py +0 -0
  234. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/package/limits.py +0 -0
  235. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/package/unpack.py +0 -0
  236. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/envs/pull.py +0 -0
  237. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/__init__.py +0 -0
  238. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/__init__.py +0 -0
  239. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/auth.py +0 -0
  240. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/bootstrap.py +0 -0
  241. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  242. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  243. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  244. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/deadline.py +0 -0
  245. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/host/__init__.py +0 -0
  246. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  247. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/host/failmark.py +0 -0
  248. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  249. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/http.py +0 -0
  250. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/instance.py +0 -0
  251. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/poll.py +0 -0
  252. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/poll_instance.py +0 -0
  253. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/provider.py +0 -0
  254. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
  255. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/_lifecycle/worker.py +0 -0
  256. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/allocator.py +0 -0
  257. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/artifacts/__init__.py +0 -0
  258. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/artifacts/hf.py +0 -0
  259. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/artifacts/preload_runpod.py +0 -0
  260. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/artifacts/weight_cache.py +0 -0
  261. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/base.py +0 -0
  262. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/fit_errors.py +0 -0
  263. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/lambda_/__init__.py +0 -0
  264. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/lambda_/api.py +0 -0
  265. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/lambda_/auth.py +0 -0
  266. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/lambda_/gpus.py +0 -0
  267. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/lambda_/jobs/__init__.py +0 -0
  268. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/lambda_/jobs/builders.py +0 -0
  269. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/lambda_/jobs/reap.py +0 -0
  270. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/lambda_/preflight.py +0 -0
  271. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/lambda_/pricing.py +0 -0
  272. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/preflight.py +0 -0
  273. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/realized.py +0 -0
  274. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/__init__.py +0 -0
  275. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/api.py +0 -0
  276. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/auth.py +0 -0
  277. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/cost.py +0 -0
  278. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/gpus.py +0 -0
  279. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/job_execution.py +0 -0
  280. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/jobs.py +0 -0
  281. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/preflight.py +0 -0
  282. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/pricing.py +0 -0
  283. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/resources.py +0 -0
  284. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/serverless/__init__.py +0 -0
  285. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/runpod/serverless/endpoints.py +0 -0
  286. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/sharding.py +0 -0
  287. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/vast/__init__.py +0 -0
  288. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/vast/api.py +0 -0
  289. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/vast/auth.py +0 -0
  290. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/vast/jobs/__init__.py +0 -0
  291. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/vast/jobs/builders.py +0 -0
  292. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/vast/preflight.py +0 -0
  293. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/providers/vast/pricing.py +0 -0
  294. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/py.typed +0 -0
  295. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/__init__.py +0 -0
  296. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/artifacts.py +0 -0
  297. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/attempts.py +0 -0
  298. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/costs.py +0 -0
  299. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/deadlines.py +0 -0
  300. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/preparation.py +0 -0
  301. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/reconciliation.py +0 -0
  302. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/results/__init__.py +0 -0
  303. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/results/checkpoints.py +0 -0
  304. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/results/verified_revisions.py +0 -0
  305. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/status.py +0 -0
  306. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/submit.py +0 -0
  307. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/supervise/__init__.py +0 -0
  308. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/supervise/attach.py +0 -0
  309. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/supervise/deploy.py +0 -0
  310. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/supervise/lifecycle.py +0 -0
  311. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/supervise/recovery.py +0 -0
  312. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/supervise/retry_decision.py +0 -0
  313. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/supervise/seed_submission.py +0 -0
  314. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/supervise/transitions.py +0 -0
  315. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runner/weight_cache.py +0 -0
  316. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runtime_capsule/__init__.py +0 -0
  317. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runtime_capsule/build.py +0 -0
  318. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runtime_capsule/manifest.py +0 -0
  319. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/runtime_capsule/profiles.py +0 -0
  320. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/schema/__init__.py +0 -0
  321. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/schema/fields.py +0 -0
  322. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/serve/__init__.py +0 -0
  323. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/serve/adapter_check.py +0 -0
  324. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/serve/deploy.py +0 -0
  325. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/serve/errors.py +0 -0
  326. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/serve/export.py +0 -0
  327. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/serve/preflight.py +0 -0
  328. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/serve/responses.py +0 -0
  329. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/serve/streaming.py +0 -0
  330. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/serve/thinking.py +0 -0
  331. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/serve/urls.py +0 -0
  332. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/__init__.py +0 -0
  333. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/__main__.py +0 -0
  334. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/app.py +0 -0
  335. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/billing/__init__.py +0 -0
  336. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/billing/charges.py +0 -0
  337. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/billing/retry.py +0 -0
  338. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/__init__.py +0 -0
  339. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/checkpoints.py +0 -0
  340. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/environment_registry.py +0 -0
  341. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/projects.py +0 -0
  342. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/reconcile.py +0 -0
  343. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/repo_cleanup.py +0 -0
  344. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/run_registry.py +0 -0
  345. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/teacher_broker.py +0 -0
  346. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/teacher_errors.py +0 -0
  347. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/domain/teacher_requests.py +0 -0
  348. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/platform/__init__.py +0 -0
  349. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/platform/auth.py +0 -0
  350. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/platform/db.py +0 -0
  351. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/platform/deps.py +0 -0
  352. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/platform/internal_client.py +0 -0
  353. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/platform/locks.py +0 -0
  354. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/platform/runtime.py +0 -0
  355. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/routes/__init__.py +0 -0
  356. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/routes/envs.py +0 -0
  357. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/routes/meta.py +0 -0
  358. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/routes/runs.py +0 -0
  359. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/routes/serving.py +0 -0
  360. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/routes/serving_completion.py +0 -0
  361. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/routes/serving_revisions.py +0 -0
  362. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/routes/serving_smoke.py +0 -0
  363. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/server/routes/teacher.py +0 -0
  364. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/teacher/__init__.py +0 -0
  365. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/teacher/limits.py +0 -0
  366. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/flash/teacher/retry_contract.py +0 -0
  367. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/scripts/build_dev_dist.py +0 -0
  368. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/scripts/check_file_size.py +0 -0
  369. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/scripts/check_function_size.py +0 -0
  370. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/scripts/check_verl_pin_exists.py +0 -0
  371. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/scripts/scrub_history.sh +0 -0
  372. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/__init__.py +0 -0
  373. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/_helpers/__init__.py +0 -0
  374. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/_helpers/profile.py +0 -0
  375. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/_helpers/runner.py +0 -0
  376. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/_helpers/specs.py +0 -0
  377. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/_helpers/teacher.py +0 -0
  378. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/_helpers/vast.py +0 -0
  379. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/capture_image_sft_processor_oracle.py +0 -0
  380. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/conftest.py +0 -0
  381. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  382. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/fixtures/math_eval.jsonl +0 -0
  383. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/fixtures/math_train.jsonl +0 -0
  384. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/live/__init__.py +0 -0
  385. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/live/conftest.py +0 -0
  386. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/live/test_lambda_live.py +0 -0
  387. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/live/test_runpod_live.py +0 -0
  388. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/live/test_sft_thinking_render_live.py +0 -0
  389. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/live/test_vast_live.py +0 -0
  390. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_accounting_coverage.py +0 -0
  391. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_adapter_shard_completeness.py +0 -0
  392. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_agent_flash_cli_contract.py +0 -0
  393. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_algorithms.py +0 -0
  394. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_allocator.py +0 -0
  395. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_backend_common.py +0 -0
  396. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_backend_jobspec_contract.py +0 -0
  397. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_bake_kernel_cache.py +0 -0
  398. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_base_model_provenance.py +0 -0
  399. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_billing_retry.py +0 -0
  400. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_build_context_contract.py +0 -0
  401. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cancel_remote.py +0 -0
  402. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_catalog_consistency.py +0 -0
  403. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_catalog_only_models.py +0 -0
  404. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_charge_pricing.py +0 -0
  405. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_checkpoint_lifecycle.py +0 -0
  406. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_checkpoints.py +0 -0
  407. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_commands.py +0 -0
  408. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_commands_coverage.py +0 -0
  409. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_credential_shadowing.py +0 -0
  410. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_errors.py +0 -0
  411. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_estimate.py +0 -0
  412. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_gpus_flag.py +0 -0
  413. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_help.py +0 -0
  414. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_main_coverage.py +0 -0
  415. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_managed.py +0 -0
  416. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_render_coverage.py +0 -0
  417. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_render_theme.py +0 -0
  418. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_traces.py +0 -0
  419. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cli_wandb_warning.py +0 -0
  420. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_client.py +0 -0
  421. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_client_import_purity.py +0 -0
  422. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_client_server_integration.py +0 -0
  423. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_client_stream_reads.py +0 -0
  424. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_config_env_vars.py +0 -0
  425. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_config_overrides.py +0 -0
  426. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_console_upload.py +0 -0
  427. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_controlled_experiment_repairs.py +0 -0
  428. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cost_analytical.py +0 -0
  429. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cost_equation.py +0 -0
  430. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cost_estimate.py +0 -0
  431. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cost_hardware.py +0 -0
  432. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_cost_models.py +0 -0
  433. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_dataset_profile.py +0 -0
  434. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_deploy_alias_move_warning.py +0 -0
  435. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_deploy_latency.py +0 -0
  436. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_dev_channel.py +0 -0
  437. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_disk_gb.py +0 -0
  438. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_endpoint_name.py +0 -0
  439. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_cache_evict.py +0 -0
  440. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_delete.py +0 -0
  441. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_download.py +0 -0
  442. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_download_api.py +0 -0
  443. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_evaluations.py +0 -0
  444. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_list_api.py +0 -0
  445. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_list_cli.py +0 -0
  446. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_list_hub.py +0 -0
  447. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_no_install.py +0 -0
  448. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_pull.py +0 -0
  449. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_pull_coverage.py +0 -0
  450. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_pull_loader_coverage.py +0 -0
  451. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_pull_managed_control_plane.py +0 -0
  452. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_rate_limit_resolve.py +0 -0
  453. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_ref_pinning.py +0 -0
  454. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_env_test.py +0 -0
  455. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_envs_coverage.py +0 -0
  456. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_export.py +0 -0
  457. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_flash_mvp.py +0 -0
  458. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_flash_worker.py +0 -0
  459. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_flashinfer_cache_dirs.py +0 -0
  460. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_freesolo_api_transport.py +0 -0
  461. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_fused_expert_warmstart.py +0 -0
  462. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_github_urlopen_retry.py +0 -0
  463. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_gpu_type_single_field.py +0 -0
  464. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_gpus.py +0 -0
  465. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_grpo_params.py +0 -0
  466. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_grpo_resident_sizing.py +0 -0
  467. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_grpo_reward_batching.py +0 -0
  468. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_health_liveness.py +0 -0
  469. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_hf_retry.py +0 -0
  470. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_idle_endpoint_reaper.py +0 -0
  471. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_image_sft_markers.py +0 -0
  472. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_image_sft_processor_parity.py +0 -0
  473. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_image_tokens.py +0 -0
  474. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_infisical_secrets.py +0 -0
  475. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_instance_bootstrap_coverage.py +0 -0
  476. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_internal_client.py +0 -0
  477. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_jobs.py +0 -0
  478. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_kernel_cache.py +0 -0
  479. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_kernel_fingerprint.py +0 -0
  480. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_kv_util.py +0 -0
  481. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_lambda_api_coverage.py +0 -0
  482. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_lambda_runner.py +0 -0
  483. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_logging.py +0 -0
  484. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_login_perms.py +0 -0
  485. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_lora_rank_coverage.py +0 -0
  486. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_lora_rank_preflight.py +0 -0
  487. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_managed_config_fields.py +0 -0
  488. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_managed_hf_repo.py +0 -0
  489. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_metrics_schema_agent_contract.py +0 -0
  490. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_mig_guard.py +0 -0
  491. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_multi_gpu_gate.py +0 -0
  492. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_multimodal_training.py +0 -0
  493. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_named_reward_metrics.py +0 -0
  494. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_oom_escalate_gpu.py +0 -0
  495. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_opd.py +0 -0
  496. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_opd_limits.py +0 -0
  497. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  498. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_opd_multiturn_failure_exit.py +0 -0
  499. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_opd_replay_guard.py +0 -0
  500. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_opd_resume_safety.py +0 -0
  501. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_opd_train.py +0 -0
  502. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_orchestrator_flash.py +0 -0
  503. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_packing.py +0 -0
  504. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_packing_coverage.py +0 -0
  505. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_parasail_teacher.py +0 -0
  506. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_persisted_spec_envelope.py +0 -0
  507. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_poll_helpers.py +0 -0
  508. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_preflight.py +0 -0
  509. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_projects.py +0 -0
  510. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_prompt_budget.py +0 -0
  511. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_provider_preflight_coverage.py +0 -0
  512. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_provider_routing.py +0 -0
  513. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_provider_teardown_robustness.py +0 -0
  514. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_providers_symmetry.py +0 -0
  515. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_realized_cost.py +0 -0
  516. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_repo_cleanup.py +0 -0
  517. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_resolve_params_b.py +0 -0
  518. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_resume_on_retry.py +0 -0
  519. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_rl_train.py +0 -0
  520. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_rollout_samples.py +0 -0
  521. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_runmgmt.py +0 -0
  522. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_runpod_api_delete.py +0 -0
  523. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_runpod_key_fingerprint.py +0 -0
  524. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_runpod_key_waterfall.py +0 -0
  525. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_runtime_capsule.py +0 -0
  526. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_serve.py +0 -0
  527. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_serve_reasoning_content.py +0 -0
  528. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_server_api.py +0 -0
  529. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_server_app_coverage.py +0 -0
  530. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_server_auth_singleflight.py +0 -0
  531. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_server_billing.py +0 -0
  532. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_server_checkpoints_coverage.py +0 -0
  533. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_server_db.py +0 -0
  534. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_server_envs_coverage.py +0 -0
  535. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_server_locks_coverage.py +0 -0
  536. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_server_standalone.py +0 -0
  537. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_serving_context_preflight.py +0 -0
  538. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_serving_contract.py +0 -0
  539. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_serving_schema_coverage.py +0 -0
  540. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_sft_chunked_nll.py +0 -0
  541. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_sft_example_selection.py +0 -0
  542. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_sft_gc_off.py +0 -0
  543. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_sft_max_context.py +0 -0
  544. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_sft_startup_block.py +0 -0
  545. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_sft_train.py +0 -0
  546. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_sft_workload.py +0 -0
  547. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_spec_and_validation.py +0 -0
  548. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_spec_contract_bytes.py +0 -0
  549. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_step_floor.py +0 -0
  550. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_step_metrics.py +0 -0
  551. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_step_timing.py +0 -0
  552. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_structured_outputs.py +0 -0
  553. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_teacher_broker.py +0 -0
  554. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_teacher_encoding_contract.py +0 -0
  555. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_terminal_artifacts.py +0 -0
  556. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_thinking_config.py +0 -0
  557. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_train_context_preflight.py +0 -0
  558. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_training_controls.py +0 -0
  559. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_type_comment_prose.py +0 -0
  560. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_vast_api.py +0 -0
  561. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_vast_api_coverage.py +0 -0
  562. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_vast_offers.py +0 -0
  563. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_vast_provider_coverage.py +0 -0
  564. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_vast_runner.py +0 -0
  565. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_verified_revisions.py +0 -0
  566. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_verifiers.py +0 -0
  567. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_verl_checkpoint_export.py +0 -0
  568. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_verl_child_plugins.py +0 -0
  569. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_verl_silence_watchdog.py +0 -0
  570. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_version.py +0 -0
  571. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  572. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_vram_architecture.py +0 -0
  573. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_wandb_link.py +0 -0
  574. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_wandb_naming.py +0 -0
  575. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_warmstart_adapter_download.py +0 -0
  576. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_warmstart_cross_repo.py +0 -0
  577. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_warmstart_error_attribution.py +0 -0
  578. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_weight_cache.py +0 -0
  579. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_worker_dryrun.py +0 -0
  580. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_worker_hardexit.py +0 -0
  581. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_worker_image.py +0 -0
  582. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_worker_init_heartbeat.py +0 -0
  583. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_worker_stack.py +0 -0
  584. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_worker_thinking.py +0 -0
  585. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_workflow_contracts.py +0 -0
  586. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/tests/test_workload_profile.py +0 -0
  587. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.68}/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.67
3
+ Version: 1.2.68
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
@@ -716,7 +716,20 @@ def cmd_env_push(args) -> int:
716
716
  readme = pkg / "README.md"
717
717
  if not readme.exists():
718
718
  readme.write_text(f"# {env_name}\n\nFlash Freesolo environment.\n")
719
- # One progress widget spans both phases the user otherwise waits through silently:
719
+ from flash.envs.package.direct_tokens import (
720
+ DirectTokenScanError,
721
+ package_contains_direct_token,
722
+ )
723
+
724
+ try:
725
+ contains_direct_token = package_contains_direct_token(pkg)
726
+ except DirectTokenScanError:
727
+ return _err("environment package could not be scanned safely")
728
+ if contains_direct_token:
729
+ return _err(
730
+ "environment package contains a direct access token; remove it before publishing"
731
+ )
732
+ # one progress widget spans both phases the user otherwise waits through silently:
720
733
  # packaging (walk + gzip, slow for large datasets) and the upload itself.
721
734
  bar = _UploadProgress(env_name)
722
735
  bar.status("packaging environment")
@@ -0,0 +1,136 @@
1
+ """Bounded raw-byte scanning for direct environment package tokens."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import re
7
+ import stat
8
+ from collections.abc import Iterator
9
+ from pathlib import Path
10
+
11
+ _CHUNK_SIZE = 64 * 1024
12
+ _URLSAFE_CLASS = rb"A-Za-z0-9_-"
13
+ _ALPHANUMERIC_CLASS = rb"A-Za-z0-9"
14
+ _TOKEN_RULES = (
15
+ (b"fslo_", _URLSAFE_CLASS, 45),
16
+ (b"hf_", _ALPHANUMERIC_CLASS, 34),
17
+ (b"pit_", _ALPHANUMERIC_CLASS, 64),
18
+ )
19
+ _TOKEN_PATTERNS = tuple(
20
+ re.compile(
21
+ rb"(?<!["
22
+ + _URLSAFE_CLASS
23
+ + rb"])(?:"
24
+ + re.escape(prefix)
25
+ + rb")(["
26
+ + body_class
27
+ + rb"]{"
28
+ + str(body_length).encode()
29
+ + rb"})(?!["
30
+ + _URLSAFE_CLASS
31
+ + rb"])"
32
+ )
33
+ for prefix, body_class, body_length in _TOKEN_RULES
34
+ )
35
+ _MAX_TOKEN_SIZE = max(len(prefix) + body_length for prefix, _, body_length in _TOKEN_RULES)
36
+ _OVERLAP = _MAX_TOKEN_SIZE + 1
37
+ _PLACEHOLDER_BODIES = frozenset(
38
+ {
39
+ b"exampletoken",
40
+ b"notarealtoken",
41
+ b"placeholdertoken",
42
+ b"replacemewithtoken",
43
+ b"testtoken",
44
+ b"yourapitokenhere",
45
+ b"yourtokenhere",
46
+ }
47
+ )
48
+
49
+
50
+ class DirectTokenScanError(Exception):
51
+ """A package could not be scanned without following or skipping a member."""
52
+
53
+ def __init__(self) -> None:
54
+ super().__init__("package scan failed")
55
+
56
+
57
+ def _is_obvious_placeholder(body: bytes) -> bool:
58
+ normalized = body.lower().translate(None, b"_-")
59
+ if normalized in _PLACEHOLDER_BODIES:
60
+ return True
61
+ return bool(normalized) and normalized[:1] in {b"0", b"x"} and len(set(normalized)) == 1
62
+
63
+
64
+ def _buffer_contains_direct_token(data: bytes, *, start_at: int, finalized_start_end: int) -> bool:
65
+ for pattern in _TOKEN_PATTERNS:
66
+ for match in pattern.finditer(data):
67
+ if match.start() < start_at:
68
+ continue
69
+ if match.start() >= finalized_start_end:
70
+ break
71
+ if not _is_obvious_placeholder(match.group(1)):
72
+ return True
73
+ return False
74
+
75
+
76
+ def _file_contains_direct_token(path: Path) -> bool:
77
+ flags = os.O_RDONLY | getattr(os, "O_BINARY", 0) | getattr(os, "O_NOFOLLOW", 0)
78
+ fd: int | None = os.open(path, flags)
79
+ try:
80
+ if not stat.S_ISREG(os.fstat(fd).st_mode):
81
+ raise DirectTokenScanError
82
+ with os.fdopen(fd, "rb") as stream:
83
+ fd = None
84
+ data = b""
85
+ buffer_start = 0
86
+ finalized_start = 0
87
+ while chunk := stream.read(_CHUNK_SIZE):
88
+ data += chunk
89
+ start_at = finalized_start - buffer_start
90
+ finalized_start_end = max(start_at, len(data) - _MAX_TOKEN_SIZE)
91
+ if _buffer_contains_direct_token(
92
+ data,
93
+ start_at=start_at,
94
+ finalized_start_end=finalized_start_end,
95
+ ):
96
+ return True
97
+ finalized_start = buffer_start + finalized_start_end
98
+ keep_from = max(0, len(data) - _OVERLAP)
99
+ data = data[keep_from:]
100
+ buffer_start += keep_from
101
+ return _buffer_contains_direct_token(
102
+ data,
103
+ start_at=finalized_start - buffer_start,
104
+ finalized_start_end=len(data),
105
+ )
106
+ finally:
107
+ if fd is not None:
108
+ os.close(fd)
109
+
110
+
111
+ def _regular_files(directory: Path) -> Iterator[Path]:
112
+ with os.scandir(directory) as listing:
113
+ entries = sorted(listing, key=lambda entry: entry.name)
114
+ for entry in entries:
115
+ if entry.is_symlink():
116
+ raise DirectTokenScanError
117
+ if entry.is_dir(follow_symlinks=False):
118
+ yield from _regular_files(Path(entry.path))
119
+ elif entry.is_file(follow_symlinks=False):
120
+ yield Path(entry.path)
121
+ else:
122
+ raise DirectTokenScanError
123
+
124
+
125
+ def package_contains_direct_token(root: Path) -> bool:
126
+ """Return whether a package tree contains a supported direct issued-token form."""
127
+ try:
128
+ root_stat = os.stat(root, follow_symlinks=False)
129
+ if not stat.S_ISDIR(root_stat.st_mode):
130
+ raise DirectTokenScanError
131
+ return any(_file_contains_direct_token(path) for path in _regular_files(root))
132
+ except DirectTokenScanError:
133
+ raise
134
+ except OSError:
135
+ pass
136
+ raise DirectTokenScanError
@@ -16,6 +16,7 @@ import urllib.parse
16
16
  from pathlib import Path
17
17
 
18
18
  from flash.envs.loader import _github_token
19
+ from flash.envs.package.direct_tokens import DirectTokenScanError, package_contains_direct_token
19
20
  from flash.envs.package.limits import (
20
21
  ARCHIVE_MEMBER_LIMIT,
21
22
  ARCHIVE_SCAN_MEMBER_LIMIT,
@@ -480,6 +481,14 @@ def publish_package(
480
481
  with tempfile.TemporaryDirectory(prefix="flash-env-publish-") as tmp:
481
482
  dest = Path(tmp)
482
483
  _safe_extract(tar_bytes, dest)
484
+ try:
485
+ contains_direct_token = package_contains_direct_token(dest)
486
+ except DirectTokenScanError:
487
+ raise EnvPublishError("env package could not be scanned safely") from None
488
+ if contains_direct_token:
489
+ raise EnvPublishError(
490
+ "env package contains a direct access token; remove it before publishing"
491
+ )
483
492
  return _github_publish(dest, name=name, key=key, project_slug=project_slug)
484
493
 
485
494
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash-dev"
3
- version = "1.2.67"
3
+ version = "1.2.68"
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.67"
140
+ version = "1.2.68"
141
141
 
142
142
  [tool.pytest.ini_options]
143
143
  pythonpath = ["."]
@@ -74,6 +74,93 @@ def _pkg_b64(files: dict[str, str]) -> str:
74
74
  return base64.b64encode(buf.getvalue()).decode()
75
75
 
76
76
 
77
+ def _issued_token(prefix: str) -> str:
78
+ body_length = {"fslo_": 45, "hf_": 34, "pit_": 64}[prefix]
79
+ seed = (
80
+ "qR2_sT4-uV6wX8yZ0aB1cD3eF5gHjK7mN9pL"
81
+ if prefix == "fslo_"
82
+ else "qR2sT4uV6wX8yZ0aB1cD3eF5gHjK7mN9pL"
83
+ )
84
+ body = (seed * 2)[:body_length]
85
+ if prefix == "fslo_":
86
+ assert {"_", "-"} <= set(body)
87
+ return prefix + body
88
+
89
+
90
+ def test_publish_rejects_direct_token_archive_before_github_publish(monkeypatch):
91
+ token = _issued_token("fslo_")
92
+ path = "scripts/bootstrap.sh"
93
+ package = {**_MINIMAL, path: f"#!/bin/sh\nexport FREESOLO_API_KEY={token}\n"}
94
+ calls: list[str] = []
95
+ monkeypatch.setattr(
96
+ envs,
97
+ "_github_publish",
98
+ lambda *_args, **_kwargs: calls.append("github") or pytest.fail("github must not start"),
99
+ )
100
+
101
+ with pytest.raises(envs.EnvPublishError) as excinfo:
102
+ envs.publish_package(
103
+ package_b64=_pkg_b64(package),
104
+ name="direct-bypass",
105
+ key={"org_slug": "acme"},
106
+ project_slug="checkout-bot",
107
+ )
108
+
109
+ assert excinfo.value.status == 400
110
+ error = str(excinfo.value)
111
+ assert "direct access token" in error
112
+ assert token not in error
113
+ assert path not in error
114
+ assert calls == []
115
+
116
+
117
+ def test_publish_direct_token_scan_failure_is_safe_400(monkeypatch):
118
+ calls: list[str] = []
119
+ monkeypatch.setattr(
120
+ envs,
121
+ "package_contains_direct_token",
122
+ lambda _dest: (_ for _ in ()).throw(envs.DirectTokenScanError()),
123
+ )
124
+ monkeypatch.setattr(
125
+ envs,
126
+ "_github_publish",
127
+ lambda *_args, **_kwargs: calls.append("github") or pytest.fail("github must not start"),
128
+ )
129
+
130
+ with pytest.raises(envs.EnvPublishError) as excinfo:
131
+ envs.publish_package(
132
+ package_b64=_pkg_b64(_MINIMAL),
133
+ name="scan-failure",
134
+ key={"org_slug": "acme"},
135
+ project_slug="checkout-bot",
136
+ )
137
+
138
+ assert excinfo.value.status == 400
139
+ assert str(excinfo.value) == "env package could not be scanned safely"
140
+ assert calls == []
141
+
142
+
143
+ def test_publish_direct_token_clean_control_reaches_github_publish(monkeypatch):
144
+ calls: list[str] = []
145
+
146
+ def fake_publish(dest, *, name, key, project_slug):
147
+ calls.append("github")
148
+ assert (dest / "environment.py").is_file()
149
+ return f"{key['org_slug']}/{project_slug}/{name}"
150
+
151
+ monkeypatch.setattr(envs, "_github_publish", fake_publish)
152
+
153
+ result = envs.publish_package(
154
+ package_b64=_pkg_b64({**_MINIMAL, "assets/data.bin": "clean opaque bytes"}),
155
+ name="clean-control",
156
+ key={"org_slug": "acme"},
157
+ project_slug="checkout-bot",
158
+ )
159
+
160
+ assert result == "acme/checkout-bot/clean-control"
161
+ assert calls == ["github"]
162
+
163
+
77
164
  def test_namespace_uses_org_slug():
78
165
  assert envs.namespace_for({"org_slug": "acme"}) == "acme"
79
166
  assert envs.namespace_for({"org": {"slug": "freesolo-co"}}) == "freesolo-co"
@@ -14,6 +14,11 @@ import pytest
14
14
 
15
15
  import flash.cli as cli
16
16
  from flash.cli.commands.env.push import _human_bytes, _UploadProgress
17
+ from flash.envs.package.direct_tokens import (
18
+ _CHUNK_SIZE,
19
+ _OVERLAP,
20
+ package_contains_direct_token,
21
+ )
17
22
 
18
23
 
19
24
  def _fake_client(capture: dict, *, slug: str = "acme/environment"):
@@ -51,6 +56,199 @@ def _args(
51
56
  return argparse.Namespace(path=str(path), name=name, project=project)
52
57
 
53
58
 
59
+ def _token_body(prefix: str, length: int) -> str:
60
+ seed = (
61
+ "aB3_dE5-fG7hJ9kL2mN4pQ6rS8tUvW0xY1zC"
62
+ if prefix == "fslo_"
63
+ else "aB3dE5fG7hJ9kL2mN4pQ6rS8tUvW0xY1zC"
64
+ )
65
+ return (seed * 2)[:length]
66
+
67
+
68
+ def _issued_token(prefix: str) -> str:
69
+ body_length = {"fslo_": 45, "hf_": 34, "pit_": 64}[prefix]
70
+ body = _token_body(prefix, body_length)
71
+ if prefix == "fslo_":
72
+ assert {"_", "-"} <= set(body)
73
+ return prefix + body
74
+
75
+
76
+ def _deny_archive_and_upload(monkeypatch, calls: list[str]) -> None:
77
+ def deny_archive(_pkg):
78
+ calls.append("archive")
79
+ raise AssertionError("archive must not be created")
80
+
81
+ monkeypatch.setattr("flash.cli.commands.env.push._tar_b64", deny_archive)
82
+ monkeypatch.setattr(
83
+ "flash.client.client_from_config",
84
+ lambda: calls.append("upload") or pytest.fail("upload must not start"),
85
+ )
86
+
87
+
88
+ @pytest.mark.parametrize(
89
+ ("prefix", "relative", "content"),
90
+ [
91
+ ("fslo_", "scripts/launch.sh", lambda token: f"#!/bin/sh\nexport API_KEY={token}\n"),
92
+ ("hf_", "helper.py", lambda token: f"TOKEN = {token!r}\n"),
93
+ ("pit_", "environment.py", lambda token: f"TOKEN = {token!r}\n"),
94
+ ],
95
+ ids=["freesolo-shell", "hugging-face-python", "prime-entrypoint"],
96
+ )
97
+ def test_push_rejects_direct_tokens_before_archive_or_upload(
98
+ monkeypatch, tmp_path, capsys, prefix, relative, content
99
+ ):
100
+ env_dir = tmp_path / "env"
101
+ env_dir.mkdir()
102
+ (env_dir / "environment.py").write_text("def load_environment(**k):\n return None\n")
103
+ target = env_dir / relative
104
+ target.parent.mkdir(parents=True, exist_ok=True)
105
+ token = _issued_token(prefix)
106
+ target.write_text(content(token))
107
+ calls: list[str] = []
108
+ _deny_archive_and_upload(monkeypatch, calls)
109
+
110
+ assert cli.cmd_env_push(_args(env_dir)) == 1
111
+
112
+ error = capsys.readouterr().err
113
+ assert "direct access token" in error
114
+ assert token not in error
115
+ assert relative not in error
116
+ assert calls == []
117
+
118
+
119
+ @pytest.mark.parametrize(
120
+ ("prefix", "body_length"),
121
+ [("fslo_", 45), ("hf_", 34), ("pit_", 64)],
122
+ ids=["freesolo", "hugging-face", "prime"],
123
+ )
124
+ @pytest.mark.parametrize("delta", [-1, 1], ids=["minus-one", "plus-one"])
125
+ def test_direct_token_neighbor_body_lengths_are_clean(tmp_path, prefix, body_length, delta):
126
+ package = tmp_path / "package"
127
+ package.mkdir()
128
+ value = prefix + _token_body(prefix, body_length + delta)
129
+ (package / "data.bin").write_bytes(b" " + value.encode() + b" ")
130
+
131
+ assert package_contains_direct_token(package) is False
132
+
133
+
134
+ @pytest.mark.parametrize(
135
+ "token_start",
136
+ [_CHUNK_SIZE - 3, _CHUNK_SIZE - _OVERLAP - 3],
137
+ ids=["read-boundary", "overlap-cutoff"],
138
+ )
139
+ def test_push_rejects_direct_token_across_chunk_boundary(
140
+ monkeypatch, tmp_path, capsys, token_start
141
+ ):
142
+ env_dir = tmp_path / "env"
143
+ env_dir.mkdir()
144
+ (env_dir / "environment.py").write_text("def load_environment(**k):\n return None\n")
145
+ token = _issued_token("hf_").encode()
146
+ (env_dir / "opaque.bin").write_bytes(b" " * token_start + token + b"\x00" * 256)
147
+ calls: list[str] = []
148
+ _deny_archive_and_upload(monkeypatch, calls)
149
+
150
+ assert cli.cmd_env_push(_args(env_dir)) == 1
151
+
152
+ error = capsys.readouterr().err
153
+ assert "direct access token" in error
154
+ assert token.decode() not in error
155
+ assert "opaque.bin" not in error
156
+ assert calls == []
157
+
158
+
159
+ def test_push_allows_clean_binary_placeholders_and_embedded_direct_token_shapes(
160
+ monkeypatch, tmp_path
161
+ ):
162
+ env_dir = tmp_path / "env"
163
+ env_dir.mkdir()
164
+ embedded = _issued_token("pit_")
165
+ placeholders = [
166
+ "fslo_" + "your_api_token_here".ljust(45, "_"),
167
+ "hf_" + "x" * 34,
168
+ "pit_" + "0" * 64,
169
+ ]
170
+ (env_dir / "environment.py").write_text(
171
+ "def load_environment(**k):\n return None\n" + "\n".join(placeholders)
172
+ )
173
+ (env_dir / "notes.txt").write_text(
174
+ "ordinary text without credentials\n"
175
+ "hf_resume_checkpoint\n"
176
+ "fslo_retry_after_close\n"
177
+ "pit_environment_identifier\n"
178
+ )
179
+ (env_dir / "opaque.bin").write_bytes(b"\x00\xffclean\x80binary\x00")
180
+ (env_dir / "embedded-left.bin").write_bytes(("left" + embedded + " ").encode())
181
+ (env_dir / "overlong.bin").write_bytes((" pit_" + "aB3" * 22 + " ").encode())
182
+ cap: dict = {}
183
+ monkeypatch.setattr("flash.client.client_from_config", _fake_client(cap))
184
+
185
+ assert cli.cmd_env_push(_args(env_dir)) == 0
186
+ assert cap["package_b64"]
187
+
188
+
189
+ def test_push_allows_direct_token_shape_with_invalid_left_at_retained_boundary(
190
+ monkeypatch, tmp_path
191
+ ):
192
+ env_dir = tmp_path / "env"
193
+ env_dir.mkdir()
194
+ (env_dir / "environment.py").write_text("def load_environment(**k):\n return None\n")
195
+ token = _issued_token("pit_").encode()
196
+ prefix_padding = b" " * (_CHUNK_SIZE - _OVERLAP - 1)
197
+ payload = prefix_padding + b"z" + token + b"\x00" + b"next chunk"
198
+ (env_dir / "retained-boundary.bin").write_bytes(payload)
199
+ cap: dict = {}
200
+ monkeypatch.setattr("flash.client.client_from_config", _fake_client(cap))
201
+
202
+ assert cli.cmd_env_push(_args(env_dir)) == 0
203
+ assert cap["package_b64"]
204
+
205
+
206
+ def test_direct_token_scan_error_drops_oserror_details(tmp_path):
207
+ from flash.envs.package.direct_tokens import DirectTokenScanError, package_contains_direct_token
208
+
209
+ missing = tmp_path / "sensitive-package-path"
210
+ with pytest.raises(DirectTokenScanError) as excinfo:
211
+ package_contains_direct_token(missing)
212
+
213
+ assert str(excinfo.value) == "package scan failed"
214
+ assert excinfo.value.__context__ is None
215
+ assert str(missing) not in str(excinfo.value)
216
+
217
+
218
+ def test_push_fails_closed_when_direct_token_scan_sees_unexpected_member(
219
+ monkeypatch, tmp_path, capsys
220
+ ):
221
+ from flash.cli.commands.env import push as envpush
222
+
223
+ env_dir = tmp_path / "env"
224
+ env_dir.mkdir()
225
+ (env_dir / "environment.py").write_text("def load_environment(**k):\n return None\n")
226
+ outside = tmp_path / "outside"
227
+ outside.write_text("clean\n")
228
+ real_copy = envpush._copy_env_sidecars
229
+
230
+ def copy_with_link(env_root, dest, *, entrypoint, include_full_tree):
231
+ real_copy(
232
+ env_root,
233
+ dest,
234
+ entrypoint=entrypoint,
235
+ include_full_tree=include_full_tree,
236
+ )
237
+ (dest / "unexpected-link").symlink_to(outside)
238
+
239
+ monkeypatch.setattr(envpush, "_copy_env_sidecars", copy_with_link)
240
+ calls: list[str] = []
241
+ _deny_archive_and_upload(monkeypatch, calls)
242
+
243
+ assert cli.cmd_env_push(_args(env_dir)) == 1
244
+
245
+ error = capsys.readouterr().err
246
+ assert "could not be scanned safely" in error
247
+ assert "unexpected-link" not in error
248
+ assert str(outside) not in error
249
+ assert calls == []
250
+
251
+
54
252
  def test_push_single_py_module_is_packaged(monkeypatch, tmp_path, capsys):
55
253
  env_file = tmp_path / "environment.py"
56
254
  env_file.write_text("def load_environment(**k):\n return None\n")
@@ -1052,7 +1052,7 @@ wheels = [
1052
1052
 
1053
1053
  [[package]]
1054
1054
  name = "freesolo-flash"
1055
- version = "1.2.67"
1055
+ version = "1.2.68"
1056
1056
  source = { editable = "." }
1057
1057
 
1058
1058
  [package.optional-dependencies]