gflow-cli 0.20.0__tar.gz → 0.20.1__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.
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.env.template +6 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/CHANGELOG.md +9 -1
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/PKG-INFO +1 -1
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/CONFIGURATION.md +8 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/INDEX.md +1 -1
- gflow_cli-0.20.1/docs/LIVE_VERIFICATION_v0.20.1.md +19 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/pyproject.toml +1 -1
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/drivers/factory.py +12 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/ui_automation.py +6 -2
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/config.py +10 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/drivers/test_factory.py +38 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_ui_automation.py +27 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_ui_automation_batch.py +57 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_config.py +9 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/uv.lock +1 -1
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/README.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.gitattributes +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.github/dependabot.yml +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.gitignore +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.gitleaks.toml +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/.secrets.baseline +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/AGENTS.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/CLAUDE.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/CONFIGURATION.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/DISCLAIMER.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/GEMINI.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/LICENSE +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/PLAN.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/README.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/RELEASE.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/ROADMAP.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/conftest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docker-compose.yml +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/DEMOS.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/GITHUB.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/MOVIE.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/PROJECT_STATUS.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/SECURITY.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/USAGE.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/examples/README.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/examples/sample_config.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/llms.txt +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/README.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/record_flow_capture.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/diag/README.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/skills/README.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/sonar-project.properties +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/client.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tasks/lessons.md +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_client.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_image.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_video.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/conftest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_models.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/dev/test_record_flow_capture.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/auth.feature +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/conftest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/image.feature +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/integration/constants.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/services/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_auth.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_chain.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_errors.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_json_output.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_manifest.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_media.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_observability.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_paths.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.20.0 → gflow_cli-0.20.1}/tests/test_smoke.py +0 -0
|
@@ -115,6 +115,12 @@
|
|
|
115
115
|
# `patchright install chromium`. Unset to revert to the default playwright engine.
|
|
116
116
|
# GFLOW_CLI_BROWSER_ENGINE=playwright
|
|
117
117
|
|
|
118
|
+
# Try to force the Classic Flow UI mode for image generation by clicking the Agent toggle pill
|
|
119
|
+
# if the page mounts in Agentic mode. This ensures deterministic aspect ratio controls.
|
|
120
|
+
# If the page cannot be switched back to Classic, falls back to Agentic mode.
|
|
121
|
+
# GFLOW_CLI_PREFER_CLASSIC=false
|
|
122
|
+
|
|
123
|
+
|
|
118
124
|
# BCP-47 locale tag passed to Playwright's launch `locale=` parameter
|
|
119
125
|
# (controls Accept-Language only — Chrome's UI language is forced to
|
|
120
126
|
# en-US via the `--lang=en-US` launch arg regardless of this setting, so
|
|
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.20.1] — 2026-06-16
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **Aspect ratio overrides in Agentic & Classic cohorts** ([#193](https://github.com/ffroliva/gflow-cli/issues/193)): Fixed a bug where aspect ratio settings were ignored under the pluggable `FlowUiDriver` strategies (both single and batch image generation paths).
|
|
15
|
+
- **`GFLOW_CLI_PREFER_CLASSIC`** (or `prefer_classic` setting): Added a configuration setting to force the classic UI driver, allowing users to bypass the Agentic UI cohort if preferred.
|
|
16
|
+
|
|
10
17
|
## [0.20.0] — 2026-06-15
|
|
11
18
|
|
|
12
19
|
### Added
|
|
@@ -1558,7 +1565,8 @@ shell-script template that branches on these codes.
|
|
|
1558
1565
|
|
|
1559
1566
|
First skeleton. Not functional end-to-end yet.
|
|
1560
1567
|
|
|
1561
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.20.
|
|
1568
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...HEAD
|
|
1569
|
+
[0.20.1]: https://github.com/ffroliva/gflow-cli/compare/v0.20.0...v0.20.1
|
|
1562
1570
|
[0.20.0]: https://github.com/ffroliva/gflow-cli/compare/v0.19.0...v0.20.0
|
|
1563
1571
|
[0.19.0]: https://github.com/ffroliva/gflow-cli/compare/v0.18.0...v0.19.0
|
|
1564
1572
|
[0.18.0]: https://github.com/ffroliva/gflow-cli/compare/v0.17.0...v0.18.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.20.
|
|
3
|
+
Version: 0.20.1
|
|
4
4
|
Summary: Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ffroliva/gflow-cli
|
|
6
6
|
Project-URL: Issues, https://github.com/ffroliva/gflow-cli/issues
|
|
@@ -200,6 +200,14 @@ GFLOW_CLI_HISTORY_PROMPTS=redacted gflow image t2i "confidential brief"
|
|
|
200
200
|
**Reverting:** unset the variable (or set `playwright`) — the default path is byte-identical to a build without this feature, with no profile migration.
|
|
201
201
|
**Security note:** the `patchright` extra ships a *patched Chromium driver* that handles your live Google session cookies; it is exact-pinned and treated as a security-review-required dependency. See [SECURITY.md § Dependencies](SECURITY.md).
|
|
202
202
|
|
|
203
|
+
### `GFLOW_CLI_PREFER_CLASSIC`
|
|
204
|
+
|
|
205
|
+
**What:** Try to force the Classic Flow UI mode for image generation by clicking the Agent toggle pill if the page mounts in Agentic mode.
|
|
206
|
+
**Values:** `true` | `false`
|
|
207
|
+
**Default:** `false`
|
|
208
|
+
**Why use it:** The Agentic UI cohort (conversational chat) treats requested aspect ratios as a soft prompt hint, which can result in inconsistent aspect ratios (e.g. producing landscape when portrait 9:16 was requested). Exposing this setting allows callers to opt into switching the UI back to Classic mode where aspect ratios are enforced deterministically (via hard Flow crop controls).
|
|
209
|
+
**Fallback:** If the page cannot be switched back to Classic (e.g., in a forced A/B cohort where the toggle is not available), the driver gracefully falls back to Agentic mode rather than blocking execution.
|
|
210
|
+
|
|
203
211
|
### `GFLOW_CLI_LOCALE`
|
|
204
212
|
|
|
205
213
|
**What:** BCP-47 locale tag passed to Playwright's `launch_persistent_context(locale=...)` — controls the `Accept-Language` HTTP header only.
|
|
@@ -112,7 +112,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
112
112
|
**"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
|
|
113
113
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
114
114
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
115
|
-
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.20.
|
|
115
|
+
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.20.1](LIVE_VERIFICATION_v0.20.1.md) (Aspect ratio overrides in Agentic & Classic cohorts; skipped honestly due to sandbox execution). Prior: [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
116
116
|
**"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships.
|
|
117
117
|
**"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
|
|
118
118
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Live Verification — v0.20.1
|
|
2
|
+
|
|
3
|
+
Feature under test:
|
|
4
|
+
- **Aspect ratio overrides in Agentic & Classic cohorts** ([#193](https://github.com/ffroliva/gflow-cli/issues/193)).
|
|
5
|
+
- **`GFLOW_CLI_PREFER_CLASSIC`** config option (`prefer_classic` setting).
|
|
6
|
+
|
|
7
|
+
## Live Verification Status
|
|
8
|
+
|
|
9
|
+
Live verification was **not run this cycle** (skipped honestly per the release protocol).
|
|
10
|
+
|
|
11
|
+
### Reason
|
|
12
|
+
The release prep was executed in an automated agent sandbox environment where live Google Flow credentials (`GFLOW_LIVE` and `GFLOW_CLI_E2E_PROFILE`) are not configured.
|
|
13
|
+
|
|
14
|
+
### Local Verification
|
|
15
|
+
To ensure no regressions, the following local verification checks were executed:
|
|
16
|
+
1. **Local Test Suite**: 1,765 local tests passed successfully (`pytest -m "not e2e and not live and not smoke"`).
|
|
17
|
+
2. **Type Checking**: `pyright src` completed with 0 errors and 0 warnings.
|
|
18
|
+
3. **Lint & Formatting**: `ruff check` and `ruff format --check` passed successfully with no violations.
|
|
19
|
+
4. **Repository Hygiene**: `check_repo_hygiene.py` and `check_doc_links.py` resolved all files and links with no violations.
|
|
@@ -122,12 +122,24 @@ async def get_ui_driver(
|
|
|
122
122
|
*,
|
|
123
123
|
timeout_s: float | None = None,
|
|
124
124
|
poll_interval_s: float | None = None,
|
|
125
|
+
prefer_classic: bool = False,
|
|
125
126
|
) -> FlowUiDriver:
|
|
126
127
|
"""Probe the DOM and return the matching :class:`FlowUiDriver`.
|
|
127
128
|
|
|
128
129
|
Call per generation — the cohort flaps per page load, so a cached driver
|
|
129
130
|
goes stale on the next navigation / batch item.
|
|
130
131
|
"""
|
|
132
|
+
if prefer_classic:
|
|
133
|
+
from gflow_cli.api.transports.ui_automation_video import (
|
|
134
|
+
VideoGenerationMixin,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
try:
|
|
138
|
+
log.info("ui_driver.prefer_classic.attempt_exit_agent")
|
|
139
|
+
await VideoGenerationMixin._exit_agent_mode(page) # type: ignore[reportPrivateUsage]
|
|
140
|
+
except Exception as exc:
|
|
141
|
+
log.warning("ui_driver.prefer_classic.exit_agent_failed", error=str(exc))
|
|
142
|
+
|
|
131
143
|
mode = await detect_ui_mode(page, timeout_s=timeout_s, poll_interval_s=poll_interval_s)
|
|
132
144
|
log.info("ui_driver.bound", mode=mode)
|
|
133
145
|
if mode == "agentic":
|
|
@@ -2052,7 +2052,9 @@ class UiAutomationTransport(VideoGenerationMixin):
|
|
|
2052
2052
|
# project page is fully rendered. The cohort flaps per page load so
|
|
2053
2053
|
# we re-probe every generation — never cache across calls.
|
|
2054
2054
|
# Classic driver requires a transport reference for send_prompt.
|
|
2055
|
-
|
|
2055
|
+
from gflow_cli.config import get_settings
|
|
2056
|
+
|
|
2057
|
+
ui_driver = await get_ui_driver(page, prefer_classic=get_settings().prefer_classic)
|
|
2056
2058
|
if ui_driver.name == "classic":
|
|
2057
2059
|
ui_driver._transport = self # type: ignore[union-attr]
|
|
2058
2060
|
|
|
@@ -2430,7 +2432,9 @@ class UiAutomationTransport(VideoGenerationMixin):
|
|
|
2430
2432
|
# cohort flaps per page load; bind once per batch (the editor stays
|
|
2431
2433
|
# mounted so the cohort is stable for this batch's lifetime).
|
|
2432
2434
|
# Classic driver requires a transport reference for send_prompt.
|
|
2433
|
-
|
|
2435
|
+
from gflow_cli.config import get_settings
|
|
2436
|
+
|
|
2437
|
+
ui_driver = await get_ui_driver(page, prefer_classic=get_settings().prefer_classic)
|
|
2434
2438
|
if ui_driver.name == "classic":
|
|
2435
2439
|
ui_driver._transport = self # type: ignore[union-attr]
|
|
2436
2440
|
|
|
@@ -221,6 +221,16 @@ class Settings(BaseSettings):
|
|
|
221
221
|
"stays playwright and is unaffected. Override via GFLOW_CLI_BROWSER_ENGINE."
|
|
222
222
|
),
|
|
223
223
|
)
|
|
224
|
+
prefer_classic: bool = Field(
|
|
225
|
+
default=False,
|
|
226
|
+
description=(
|
|
227
|
+
"Try to force the Classic Flow UI mode for image generation by clicking "
|
|
228
|
+
"the Agent toggle pill if the page mounts in Agentic mode. This ensures "
|
|
229
|
+
"deterministic aspect ratio controls. "
|
|
230
|
+
"If the page cannot be switched back to Classic, falls back to Agentic mode. "
|
|
231
|
+
"Override via GFLOW_CLI_PREFER_CLASSIC."
|
|
232
|
+
),
|
|
233
|
+
)
|
|
224
234
|
|
|
225
235
|
# --- logging ----------------------------------------------------------
|
|
226
236
|
log_level: LogLevel = LogLevel.INFO
|
|
@@ -141,3 +141,41 @@ async def test_get_ui_driver_returns_agentic() -> None:
|
|
|
141
141
|
async def test_get_ui_driver_default_is_classic() -> None:
|
|
142
142
|
driver = await get_ui_driver(_fake_page(set()), timeout_s=0.0)
|
|
143
143
|
assert isinstance(driver, ClassicFlowUiDriver)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
@pytest.mark.asyncio
|
|
147
|
+
async def test_get_ui_driver_with_prefer_classic() -> None:
|
|
148
|
+
from unittest.mock import patch
|
|
149
|
+
|
|
150
|
+
# 1. When prefer_classic=True and exit succeeds:
|
|
151
|
+
page = _fake_page({_TUNE})
|
|
152
|
+
|
|
153
|
+
with patch(
|
|
154
|
+
"gflow_cli.api.transports.ui_automation_video.VideoGenerationMixin._exit_agent_mode"
|
|
155
|
+
) as mock_exit:
|
|
156
|
+
|
|
157
|
+
async def mock_exit_action(p, *, out_dir=None):
|
|
158
|
+
def new_locator(sel: str) -> MagicMock:
|
|
159
|
+
loc = MagicMock()
|
|
160
|
+
loc.count = AsyncMock(return_value=1 if sel == _CROP else 0)
|
|
161
|
+
return loc
|
|
162
|
+
|
|
163
|
+
p.locator.side_effect = new_locator
|
|
164
|
+
return True
|
|
165
|
+
|
|
166
|
+
mock_exit.side_effect = mock_exit_action
|
|
167
|
+
|
|
168
|
+
driver = await get_ui_driver(page, prefer_classic=True)
|
|
169
|
+
assert isinstance(driver, ClassicFlowUiDriver)
|
|
170
|
+
mock_exit.assert_called_once_with(page)
|
|
171
|
+
|
|
172
|
+
# 2. When prefer_classic=True but exit fails:
|
|
173
|
+
page = _fake_page({_TUNE})
|
|
174
|
+
|
|
175
|
+
with patch(
|
|
176
|
+
"gflow_cli.api.transports.ui_automation_video.VideoGenerationMixin._exit_agent_mode"
|
|
177
|
+
) as mock_exit:
|
|
178
|
+
mock_exit.side_effect = RuntimeError("Failed to exit agent mode")
|
|
179
|
+
driver = await get_ui_driver(page, prefer_classic=True)
|
|
180
|
+
assert isinstance(driver, AgenticFlowUiDriver)
|
|
181
|
+
mock_exit.assert_called_once_with(page)
|
|
@@ -1078,6 +1078,33 @@ class TestGenerateImages:
|
|
|
1078
1078
|
assert images[0].fife_url == "https://lh3.googleusercontent.com/abc123"
|
|
1079
1079
|
assert images[0].seed == 42
|
|
1080
1080
|
|
|
1081
|
+
@pytest.mark.asyncio
|
|
1082
|
+
async def test_generate_images_threads_prefer_classic(
|
|
1083
|
+
self, monkeypatch: pytest.MonkeyPatch
|
|
1084
|
+
) -> None:
|
|
1085
|
+
t = UiAutomationTransport()
|
|
1086
|
+
t._setup_done = True
|
|
1087
|
+
t._page = MagicMock()
|
|
1088
|
+
|
|
1089
|
+
# Set prefer_classic in settings to True
|
|
1090
|
+
monkeypatch.setenv("GFLOW_CLI_PREFER_CLASSIC", "true")
|
|
1091
|
+
from gflow_cli.config import reset_settings
|
|
1092
|
+
|
|
1093
|
+
reset_settings()
|
|
1094
|
+
|
|
1095
|
+
mock_get_driver = AsyncMock()
|
|
1096
|
+
mock_get_driver.return_value.name = "classic"
|
|
1097
|
+
|
|
1098
|
+
with (
|
|
1099
|
+
patch("gflow_cli.api.transports.drivers.factory.get_ui_driver", new=mock_get_driver),
|
|
1100
|
+
patch.object(t, "_enter_editor", new=AsyncMock()),
|
|
1101
|
+
patch.object(t, "_send_prompt", new=AsyncMock()),
|
|
1102
|
+
patch.object(t, "_await_captured", new=AsyncMock(return_value=[_flow_200_capture()])),
|
|
1103
|
+
):
|
|
1104
|
+
await t.generate_images(project_id="ignored", request=_req())
|
|
1105
|
+
|
|
1106
|
+
mock_get_driver.assert_called_once_with(t._page, prefer_classic=True)
|
|
1107
|
+
|
|
1081
1108
|
@pytest.mark.asyncio
|
|
1082
1109
|
async def test_non_200_response_raises(self) -> None:
|
|
1083
1110
|
t = UiAutomationTransport()
|
|
@@ -1176,3 +1176,60 @@ async def test_configure_generation_settings_resets_count_between_prompts() -> N
|
|
|
1176
1176
|
f"Prompt 1 (count=1) must click nth(0) after prompt 0's nth(1). "
|
|
1177
1177
|
f"Full click log: {clicks_after_prompt1}"
|
|
1178
1178
|
)
|
|
1179
|
+
|
|
1180
|
+
|
|
1181
|
+
@pytest.mark.asyncio
|
|
1182
|
+
async def test_generate_images_batch_threads_prefer_classic(
|
|
1183
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
1184
|
+
) -> None:
|
|
1185
|
+
import gflow_cli.api.transports.ui_automation as uia_mod
|
|
1186
|
+
from gflow_cli.api.image import Aspect, GenerateImageRequest, Model
|
|
1187
|
+
|
|
1188
|
+
transport = UiAutomationTransport.__new__(UiAutomationTransport)
|
|
1189
|
+
transport._setup_done = True
|
|
1190
|
+
transport._page = MagicMock()
|
|
1191
|
+
transport._page.url = "https://labs.google/fx/tools/flow/project/PROJ-PREFER"
|
|
1192
|
+
transport._out_dir = None
|
|
1193
|
+
transport._generate_lock = __import__("asyncio").Lock()
|
|
1194
|
+
|
|
1195
|
+
transport._enter_editor = AsyncMock()
|
|
1196
|
+
transport._dismiss_blocking_overlays = AsyncMock()
|
|
1197
|
+
transport._send_prompt = AsyncMock()
|
|
1198
|
+
|
|
1199
|
+
# Set prefer_classic in settings to True
|
|
1200
|
+
monkeypatch.setenv("GFLOW_CLI_PREFER_CLASSIC", "true")
|
|
1201
|
+
from gflow_cli.config import reset_settings
|
|
1202
|
+
|
|
1203
|
+
reset_settings()
|
|
1204
|
+
|
|
1205
|
+
mock_get_driver = AsyncMock()
|
|
1206
|
+
mock_get_driver.return_value.name = "classic"
|
|
1207
|
+
|
|
1208
|
+
from gflow_cli.api.dto import BatchSubmissionResult
|
|
1209
|
+
|
|
1210
|
+
transport._run_one_prompt_in_batch = AsyncMock(
|
|
1211
|
+
return_value=(
|
|
1212
|
+
BatchSubmissionResult(
|
|
1213
|
+
status="ok",
|
|
1214
|
+
project_id="PROJ-PREFER",
|
|
1215
|
+
prompt_idx=0,
|
|
1216
|
+
prompt_hash="abc",
|
|
1217
|
+
images=(),
|
|
1218
|
+
),
|
|
1219
|
+
None,
|
|
1220
|
+
)
|
|
1221
|
+
)
|
|
1222
|
+
monkeypatch.setattr(uia_mod, "_extract_project_id", lambda url: "PROJ-PREFER")
|
|
1223
|
+
|
|
1224
|
+
prompts = [
|
|
1225
|
+
GenerateImageRequest(prompt="p0", aspect=Aspect.PORTRAIT, model=Model.NARWHAL, count=1),
|
|
1226
|
+
]
|
|
1227
|
+
|
|
1228
|
+
with (
|
|
1229
|
+
patch("gflow_cli.api.transports.drivers.factory.get_ui_driver", new=mock_get_driver),
|
|
1230
|
+
):
|
|
1231
|
+
await transport.generate_images_batch(
|
|
1232
|
+
prompts=prompts, jitter_range=(0.0, 0.0), continue_on_error=False
|
|
1233
|
+
)
|
|
1234
|
+
|
|
1235
|
+
mock_get_driver.assert_called_once_with(transport._page, prefer_classic=True)
|
|
@@ -186,3 +186,12 @@ class TestBrowserEngine:
|
|
|
186
186
|
monkeypatch.setenv("GFLOW_CLI_BROWSER_ENGINE", "patchwright")
|
|
187
187
|
with pytest.raises(ValidationError):
|
|
188
188
|
Settings()
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class TestPreferClassic:
|
|
192
|
+
def test_defaults_to_false(self, clean_env: None) -> None:
|
|
193
|
+
assert Settings().prefer_classic is False
|
|
194
|
+
|
|
195
|
+
def test_override_true(self, monkeypatch: pytest.MonkeyPatch) -> None:
|
|
196
|
+
monkeypatch.setenv("GFLOW_CLI_PREFER_CLASSIC", "true")
|
|
197
|
+
assert Settings().prefer_classic is True
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gflow_cli-0.20.0 → gflow_cli-0.20.1}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|