gflow-cli 0.17.0__tar.gz → 0.19.0__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.17.0 → gflow_cli-0.19.0}/.env.template +9 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/CHANGELOG.md +43 -1
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/PKG-INFO +3 -1
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/CONFIGURATION.md +10 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/INDEX.md +1 -1
- gflow_cli-0.19.0/docs/LIVE_VERIFICATION_v0.18.0.md +72 -0
- gflow_cli-0.19.0/docs/LIVE_VERIFICATION_v0.19.0.md +60 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/SECURITY.md +20 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/USAGE.md +7 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/pyproject.toml +10 -1
- gflow_cli-0.19.0/scripts/dev/spike_patchright.py +357 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/__init__.py +1 -1
- gflow_cli-0.19.0/src/gflow_cli/api/_engine.py +113 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/_retry.py +5 -3
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/client.py +22 -3
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/recaptcha.py +11 -3
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/transports/ui_automation.py +40 -10
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/transports/ui_automation_video.py +34 -8
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/cli.py +21 -1
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/cli_image.py +4 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/config.py +25 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/errors.py +55 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/exceptions.py +1 -0
- gflow_cli-0.19.0/tests/api/test_engine.py +95 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_retry.py +27 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_ui_automation_image_mode.py +24 -2
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_ui_automation_video.py +16 -3
- gflow_cli-0.19.0/tests/cli/test_cli_image_selector_drift.py +74 -0
- gflow_cli-0.19.0/tests/cli/test_settings_validation.py +35 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_config.py +27 -1
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_errors.py +63 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/uv.lock +25 -2
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/README.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.gitattributes +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.gitignore +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/.secrets.baseline +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/AGENTS.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/CLAUDE.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/GEMINI.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/LICENSE +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/PLAN.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/README.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/RELEASE.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/ROADMAP.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/conftest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docker-compose.yml +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/PROJECT_STATUS.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/examples/README.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/llms.txt +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/README.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/record_flow_capture.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/skills/README.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/sonar-project.properties +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/conftest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/dev/test_record_flow_capture.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_media.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.17.0 → gflow_cli-0.19.0}/tests/test_smoke.py +0 -0
|
@@ -106,6 +106,15 @@
|
|
|
106
106
|
# visible window). The session is still reused from the persistent profile.
|
|
107
107
|
# GFLOW_CLI_HEADLESS=true
|
|
108
108
|
|
|
109
|
+
# Browser automation engine — playwright (default) | patchright
|
|
110
|
+
# patchright is an OPT-IN, drop-in patched Playwright (Chromium) that avoids the
|
|
111
|
+
# Runtime.enable CDP leak for stronger reCAPTCHA-Enterprise evasion on the HEADED
|
|
112
|
+
# path. It is NOT a headless unlock. Requires a separate install:
|
|
113
|
+
# pip install patchright (or: pip install 'gflow-cli[patchright]')
|
|
114
|
+
# When using system Chrome (channel=chrome, the gflow default) you do NOT need
|
|
115
|
+
# `patchright install chromium`. Unset to revert to the default playwright engine.
|
|
116
|
+
# GFLOW_CLI_BROWSER_ENGINE=playwright
|
|
117
|
+
|
|
109
118
|
# BCP-47 locale tag passed to Playwright's launch `locale=` parameter
|
|
110
119
|
# (controls Accept-Language only — Chrome's UI language is forced to
|
|
111
120
|
# en-US via the `--lang=en-US` launch arg regardless of this setting, so
|
|
@@ -7,6 +7,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.19.0] — 2026-06-12
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Opt-in Patchright browser engine** via `GFLOW_CLI_BROWSER_ENGINE=patchright`
|
|
15
|
+
(default `playwright`, unchanged). Patchright is a drop-in patched Playwright
|
|
16
|
+
(Chromium) that runs page evaluations in an isolated execution context to
|
|
17
|
+
avoid the `Runtime.enable` CDP leak, for stronger reCAPTCHA-Enterprise evasion
|
|
18
|
+
on the **headed** path. It is **not** a headless unlock and must be installed
|
|
19
|
+
separately: `pip install 'gflow-cli[patchright]'`. The default engine is
|
|
20
|
+
byte-identical to before. `gflow auth status` now reports the active engine.
|
|
21
|
+
- `BrowserEngineUnavailableError` (exit code 24): selecting `patchright` without
|
|
22
|
+
the package installed now fails with a clear `pip install patchright`
|
|
23
|
+
remediation hint instead of a raw `ImportError` hashed to a generic exit 1.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- An invalid `GFLOW_CLI_*` enum value (e.g. a typo'd `GFLOW_CLI_BROWSER_ENGINE`,
|
|
28
|
+
`GFLOW_CLI_PROVIDER`, or `GFLOW_CLI_LOG_LEVEL`) now fails with a clean
|
|
29
|
+
configuration error and **exit code 11** naming the offending variable, instead
|
|
30
|
+
of leaking a raw pydantic `ValidationError` traceback and exiting 1.
|
|
31
|
+
|
|
32
|
+
## [0.18.0] — 2026-06-12
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
|
|
36
|
+
- `UiSelectorDriftError` (exit code 23): UI-automation selector-probe failures — e.g. the
|
|
37
|
+
mode-switch `crop_*` trigger missing from the Flow editor (issue #183) — now raise a typed
|
|
38
|
+
error carrying the probe name, the debug-screenshot path, and a remediation hint, instead
|
|
39
|
+
of an opaque "Unexpected error" (exit 1) whose message was hashed away in logs. Converted
|
|
40
|
+
probes: mode-switch trigger, Image/Video mode tabs, and video sub-mode tabs, in both the
|
|
41
|
+
image and video transports.
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
|
|
45
|
+
- `gflow image` commands (`t2i` / `i2i` / `upscale` / `upload`) now plumb their output
|
|
46
|
+
directory into the API client, so debug screenshots are actually captured on
|
|
47
|
+
UI-automation failures. Previously the transport's screenshot directory was never set on
|
|
48
|
+
the image path and drift errors reported `Screenshot: None` even with `--verbose`.
|
|
49
|
+
|
|
10
50
|
## [0.17.0] — 2026-06-12
|
|
11
51
|
|
|
12
52
|
### Added
|
|
@@ -1509,7 +1549,9 @@ shell-script template that branches on these codes.
|
|
|
1509
1549
|
|
|
1510
1550
|
First skeleton. Not functional end-to-end yet.
|
|
1511
1551
|
|
|
1512
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1552
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.19.0...HEAD
|
|
1553
|
+
[0.19.0]: https://github.com/ffroliva/gflow-cli/compare/v0.18.0...v0.19.0
|
|
1554
|
+
[0.18.0]: https://github.com/ffroliva/gflow-cli/compare/v0.17.0...v0.18.0
|
|
1513
1555
|
[0.17.0]: https://github.com/ffroliva/gflow-cli/compare/v0.16.0...v0.17.0
|
|
1514
1556
|
[0.16.0]: https://github.com/ffroliva/gflow-cli/compare/v0.15.1...v0.16.0
|
|
1515
1557
|
[0.15.1]: https://github.com/ffroliva/gflow-cli/compare/v0.15.0...v0.15.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.19.0
|
|
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
|
|
@@ -58,6 +58,8 @@ Requires-Dist: ruff>=0.15.16; extra == 'dev'
|
|
|
58
58
|
Provides-Extra: gcs
|
|
59
59
|
Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
|
|
60
60
|
Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
|
|
61
|
+
Provides-Extra: patchright
|
|
62
|
+
Requires-Dist: patchright==1.60.1; extra == 'patchright'
|
|
61
63
|
Provides-Extra: s3
|
|
62
64
|
Requires-Dist: s3fs>=2024.2.0; extra == 's3'
|
|
63
65
|
Requires-Dist: universal-pathlib>=0.2.5; extra == 's3'
|
|
@@ -190,6 +190,16 @@ GFLOW_CLI_HISTORY_PROMPTS=redacted gflow image t2i "confidential brief"
|
|
|
190
190
|
**Default:** `true`
|
|
191
191
|
**When to flip to `false`:** if reCAPTCHA Enterprise refuses to mint tokens (Google's bot-detection sometimes refuses headless Chromium but accepts a visible window). Set to `false` and re-run; the browser will appear during generation but the session is still reused from the persistent profile.
|
|
192
192
|
|
|
193
|
+
### `GFLOW_CLI_BROWSER_ENGINE`
|
|
194
|
+
|
|
195
|
+
**What:** Selects the browser-automation engine backing the Playwright API.
|
|
196
|
+
**Values:** `playwright` | `patchright`
|
|
197
|
+
**Default:** `playwright`
|
|
198
|
+
**What `patchright` is:** an opt-in, drop-in patched Playwright (Chromium) that runs page evaluations in an isolated execution context to avoid the `Runtime.enable` CDP leak, for stronger reCAPTCHA-Enterprise evasion on the **headed** path. It is **not** a headless unlock — Google still detects headless Chromium regardless of engine.
|
|
199
|
+
**Install:** `pip install 'gflow-cli[patchright]'` (or `pip install patchright`). Selecting `patchright` without it installed fails fast with exit code 24 and a pip remediation hint. When using system Chrome (the gflow default, `channel=chrome`) you do **not** need `patchright install chromium`.
|
|
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
|
+
**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
|
+
|
|
193
203
|
### `GFLOW_CLI_LOCALE`
|
|
194
204
|
|
|
195
205
|
**What:** BCP-47 locale tag passed to Playwright's `launch_persistent_context(locale=...)` — controls the `Accept-Language` HTTP header only.
|
|
@@ -111,7 +111,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
111
111
|
**"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
|
|
112
112
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
113
113
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
114
|
-
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.
|
|
114
|
+
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.19.0](LIVE_VERIFICATION_v0.19.0.md) (opt-in patchright engine: credit-free `image t2i` end-to-end under `GFLOW_CLI_BROWSER_ENGINE=patchright`, 5-layer ledger + missing-dep/invalid-enum/default-path checks; 403→200 premise documented as pending a hot profile). v0.14.0 / v0.15.0 / v0.15.1 shipped without a dedicated doc (CI + the v0.13.0 baseline). Prior: [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)
|
|
115
115
|
**"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.
|
|
116
116
|
**"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)
|
|
117
117
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Live verification — v0.18.0
|
|
2
|
+
|
|
3
|
+
> Evidence record for the v0.18.0 release. v0.18.0 ships one feature — typed
|
|
4
|
+
> `UiSelectorDriftError` (exit code 23) for UI-automation selector-probe failures
|
|
5
|
+
> (issue #183, PR #184) — and one fix: the `gflow image` command family now wires
|
|
6
|
+
> its output directory into the API client so debug screenshots are actually
|
|
7
|
+
> captured on UI-automation failures.
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
- **Verified by:** ffroliva (Claude Code)
|
|
12
|
+
- **Date:** 2026-06-12 (live runs on the PR #184 head `45ae442`, merged unchanged
|
|
13
|
+
into `develop @ 9f1d80b`)
|
|
14
|
+
- **gflow-cli version:** 0.18.0 (pre-tag verification)
|
|
15
|
+
- **Status:** 🟢 Green — both the failure path (drift simulation) and the happy
|
|
16
|
+
path live-verified, **credit-free** (image generation spends no Veo credits)
|
|
17
|
+
|
|
18
|
+
## 1. Pre-tag gates
|
|
19
|
+
|
|
20
|
+
- `ruff check src tests` — clean; `ruff format --check` — 220 files formatted
|
|
21
|
+
- `pyright src` — 0 errors (7 pre-existing `browser_cookie3` resolution errors in
|
|
22
|
+
the local env only, untouched `auth/cookies.py`; CI green)
|
|
23
|
+
- Scoped pytest (errors + transports + cli surfaces) — 475 passed, 1 skipped
|
|
24
|
+
- PR #184 CI — 7/7 checks green on `45ae442` (test matrix 3.11/3.12/3.13,
|
|
25
|
+
gitleaks, SonarCloud)
|
|
26
|
+
|
|
27
|
+
## 2. Failure path — live drift simulation (the issue-#183 condition)
|
|
28
|
+
|
|
29
|
+
`MODE_SWITCH_TRIGGER_SELECTORS` was patched (in both transport module namespaces)
|
|
30
|
+
to a guaranteed-miss selector, reproducing exactly the reporter's DOM condition —
|
|
31
|
+
the crop_* mode-switch trigger absent from the Flow editor. The real CLI t2i path
|
|
32
|
+
was then run against live Flow (profile `denon82`, project created, $0 credits —
|
|
33
|
+
the failure fires before any generation).
|
|
34
|
+
|
|
35
|
+
| Ledger layer | Evidence |
|
|
36
|
+
|---|---|
|
|
37
|
+
| Exit code | **23** (`UiSelectorDriftError` via `EXIT_CODE_MAP`) |
|
|
38
|
+
| File count | 1 — `debug_no_mode_trigger.png` written to the `--out` dir |
|
|
39
|
+
| Magic bytes | `\x89PNG\r\n\x1a\n` ✅ (valid PNG) |
|
|
40
|
+
| Dimensions | 1280×720 (Pillow) |
|
|
41
|
+
| structlog invariants | `selector_miss` ×1 (bogus selector) → `selector_probe_failed` → `error_raised` with full RFC 9457 problem payload; **zero** `error_unhandled` / `message_hash` events |
|
|
42
|
+
| User-visible artifact | `Flow UI selector drift: probe=mode_switch_trigger: no matching element found on the Flow editor. Screenshot: <out-dir>/debug_no_mode_trigger.png` + remediation hint (no `--verbose` claim, PII warning present) |
|
|
43
|
+
|
|
44
|
+
This is the user-facing contract the release exists for: the issue-#183 reporter
|
|
45
|
+
saw `Unexpected error` (exit 1) with the real message hashed away; on v0.18.0 the
|
|
46
|
+
same condition produces an actionable, screenshot-carrying exit-23 error.
|
|
47
|
+
|
|
48
|
+
## 3. Happy path — mode-switch unregressed
|
|
49
|
+
|
|
50
|
+
`gflow --verbose image t2i "<prompt>" --profile denon82 --aspect 9:16 --out <dir>`
|
|
51
|
+
against live Flow:
|
|
52
|
+
|
|
53
|
+
| Ledger layer | Evidence |
|
|
54
|
+
|---|---|
|
|
55
|
+
| Exit code | 0 |
|
|
56
|
+
| File count | 1 (`ec262f4c-….jpg`) |
|
|
57
|
+
| Magic bytes | `\xff\xd8\xff` ✅ (valid JPEG) |
|
|
58
|
+
| Dimensions | 768×1376 (portrait — matches `--aspect 9:16`) |
|
|
59
|
+
| structlog invariants | `image_mode_entered` fired (mode-switch dropdown found and used); no `UiSelectorDriftError` in the run |
|
|
60
|
+
| User gallery | image present in the Flow project gallery (denon82) |
|
|
61
|
+
|
|
62
|
+
## 4. Not verified this cycle (recorded, not omitted)
|
|
63
|
+
|
|
64
|
+
- **The drift error on a genuinely affected account:** the issue-#183 reporter's
|
|
65
|
+
account is in the (suspected) issue-#174 new-UI A/B cohort; both maintainer
|
|
66
|
+
accounts probed as the old dialog UI on 2026-06-12, so the organic condition is
|
|
67
|
+
not reproducible on our side. The simulation in § 2 exercises the identical
|
|
68
|
+
code path (selector cascade miss → typed raise → CLI boundary → exit 23).
|
|
69
|
+
Reporter confirmation is requested on #183.
|
|
70
|
+
- **`cli_character.py` screenshot wiring:** intentionally out of scope for this
|
|
71
|
+
release (tracked as a follow-up); its drift errors correctly omit the
|
|
72
|
+
`Screenshot:` clause.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Live Verification — v0.19.0
|
|
2
|
+
|
|
3
|
+
Feature under test: **opt-in Patchright browser engine** (`GFLOW_CLI_BROWSER_ENGINE=patchright`).
|
|
4
|
+
Verified 2026-06-12 against live Google Flow on a real authenticated profile. Image
|
|
5
|
+
generation is credit-free, so the end-to-end run cost **$0**.
|
|
6
|
+
|
|
7
|
+
## Layer 1 — file count
|
|
8
|
+
|
|
9
|
+
One image produced by `gflow image t2i` through the integrated patchright path:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
scripts/dev/_spike_out/patch_verify/images/2026-06-12/6cb21d9e-e4f9-40ba-897c-eb25c6333892_1.jpg
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
(written to a throwaway `GFLOW_CLI_OUTPUT_DIR`, since cleaned up).
|
|
16
|
+
|
|
17
|
+
## Layer 2 — magic bytes
|
|
18
|
+
|
|
19
|
+
`b[:3] == FF D8 FF` → **valid JPEG**. Size 723,911 bytes.
|
|
20
|
+
|
|
21
|
+
## Layer 3 — dimensions / shape
|
|
22
|
+
|
|
23
|
+
Pillow: `format=JPEG dims=(768, 1376)` → correct **9:16** portrait (the default aspect).
|
|
24
|
+
|
|
25
|
+
## Layer 4 — structlog invariants
|
|
26
|
+
|
|
27
|
+
From the live run (`correlation_id=40877345-0af4-472f-966a-94f88112f0d9`):
|
|
28
|
+
|
|
29
|
+
- `browser.engine_selected engine=patchright` — the **settings resolver** selected
|
|
30
|
+
patchright (the real wired path, not a test monkeypatch).
|
|
31
|
+
- `ui_automation.batch_request_body` — prompt submitted (`bytes=5054`).
|
|
32
|
+
- `ui_automation.batch_response_seen status=200` and
|
|
33
|
+
`ui_automation.batch_response_captured status=200` — `batchGenerateImages`
|
|
34
|
+
returned 200 and the response body parsed under patchright.
|
|
35
|
+
|
|
36
|
+
## Layer 5 — user-confirmable artifact
|
|
37
|
+
|
|
38
|
+
A studio-lit image of "a small green cactus in a terracotta pot" — visually
|
|
39
|
+
inspectable, matches the prompt.
|
|
40
|
+
|
|
41
|
+
## Supporting checks (same release)
|
|
42
|
+
|
|
43
|
+
| Check | Evidence | Result |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| Default path byte-identical | client-level `navigator.webdriver` read through real `FlowApiClient`: `playwright → None` (masked), `patchright → False` (both non-bot) | ✅ default still stealthed |
|
|
46
|
+
| Missing-dependency UX | `GFLOW_CLI_BROWSER_ENGINE=patchright` with patchright uninstalled → `image t2i` | ✅ **exit 24**, `BrowserEngineUnavailableError` + `pip install patchright` hint, no traceback, no browser launched |
|
|
47
|
+
| Invalid enum setting | `GFLOW_CLI_BROWSER_ENGINE=patchwright` (and `GFLOW_CLI_PROVIDER=bogus`) | ✅ **exit 11**, clean "Configuration error" naming the variable, no raw pydantic traceback |
|
|
48
|
+
| reCAPTCHA mint under patchright | `TokenMinter.mint` with `isolated_context=False` | ✅ returns a real token (the predicted isolated-world break, fixed) |
|
|
49
|
+
| Retry across engine boundary | patchright's distinct `TimeoutError` through the real retry policy | ✅ retried (unit test) |
|
|
50
|
+
|
|
51
|
+
## Premise still pending (documented, not a blocker)
|
|
52
|
+
|
|
53
|
+
The *value* premise — does patchright reduce real 403s vs Playwright — could **not**
|
|
54
|
+
be measured this cycle: the documented hot profile (`denon82`) had cooled, so plain
|
|
55
|
+
Playwright also returned 200 (no 403 to flip). A faithful 403 cannot be emulated
|
|
56
|
+
locally (a route-injected 403 is engine-blind; inflating real WAF heat risks the
|
|
57
|
+
account). The feature ships as a **proven non-breaking, opt-in escape-hatch** with
|
|
58
|
+
the default unchanged. Re-fire trigger: the instant any profile actually 403s, run
|
|
59
|
+
`scripts/dev/spike_patchright.py --profile <hot> --engines playwright,patchright`
|
|
60
|
+
to capture the `WAF_403 → OK_200` differential.
|
|
@@ -201,6 +201,26 @@ Audited with `pip-audit` in CI on every push. Major dependency surface:
|
|
|
201
201
|
|
|
202
202
|
No transitive dep with known CVEs at the time of v0.1.0 scaffold.
|
|
203
203
|
|
|
204
|
+
### Optional `patchright` engine — elevated supply-chain trust
|
|
205
|
+
|
|
206
|
+
The `gflow-cli[patchright]` extra (opt-in via `GFLOW_CLI_BROWSER_ENGINE=patchright`)
|
|
207
|
+
installs **Patchright**, a single-maintainer package that ships a **patched
|
|
208
|
+
Chromium driver**. Because that driver *is* the browser process that loads your
|
|
209
|
+
real Google session — it has direct access to session cookies, the OAuth Bearer
|
|
210
|
+
token, and SAPISID — it carries a higher blast radius than an ordinary Python
|
|
211
|
+
dependency: a compromised release could exfiltrate the full Google session.
|
|
212
|
+
|
|
213
|
+
Controls:
|
|
214
|
+
|
|
215
|
+
- **Optional-only** — never in the base `dependencies`; the default install pulls
|
|
216
|
+
neither the package nor its driver.
|
|
217
|
+
- **Exact-pinned** (`patchright==1.60.1`) so a release cannot silently move the
|
|
218
|
+
browser binary underneath you.
|
|
219
|
+
- **Security-review-required on bump** — a Patchright version change is treated
|
|
220
|
+
like a browser-binary change, NOT a routine dependabot auto-merge.
|
|
221
|
+
- Default engine is `playwright` (Microsoft, security-reviewed); patchright is an
|
|
222
|
+
experiment you opt into per the trade-off above.
|
|
223
|
+
|
|
204
224
|
## Reporting
|
|
205
225
|
|
|
206
226
|
| Issue type | How |
|
|
@@ -1022,9 +1022,16 @@ shell scripts can branch on the failure mode without parsing stderr.
|
|
|
1022
1022
|
| `12` | `AuthLoginTimeoutError` | Browser sign-in was not completed in time | Re-run login or raise `GFLOW_CLI_AUTH_LOGIN_TIMEOUT` |
|
|
1023
1023
|
| `13` | `SecurityError` | Unsafe local profile or secret handling blocked | Follow the error's safety guidance |
|
|
1024
1024
|
| `14` | `AuthBrowserRejectedError` | Google rejected the login browser | `gflow auth login --browser chrome` |
|
|
1025
|
+
| `15` | `BrowserSessionClosedError` | The automation browser window was closed mid-operation | Re-run; keep the browser window open until the command finishes |
|
|
1025
1026
|
| `16` | `DataStoreError` | Local database cannot be opened, a migration failed, or the DB schema is newer than the installed gflow-cli | See below |
|
|
1026
1027
|
| `17` | `ModelModeIncompatibilityError` | The chosen video model can't do the requested mode (e.g. `--model omni-flash` with an `i2v` start/end frame — issue #125) | Use `--model veo-lite` (or veo-fast / veo-quality / veo-lite-lp) for `i2v` |
|
|
1027
1028
|
| `18` | `VideoModelSelectionError` | gflow could not select the requested video model in Flow's editor for an `i2v` run (model-picker option not found) | Usually transient — retry; if it persists, Flow's model-picker UI changed (report referencing #125) |
|
|
1029
|
+
| `19` | `SceneConcatError` | Server-side scene render/concat failed (`gflow scene --output`) | Retry; the recorded compose survives, so re-render is safe |
|
|
1030
|
+
| `20` | `FrameExtractionError` | Could not extract the last frame for a video chain link | Check the source video downloaded intact; retry the link |
|
|
1031
|
+
| `21` | `ChainPartialError` | A video chain stopped mid-way; earlier links completed | Resume from the last completed link shown in the error |
|
|
1032
|
+
| `22` | `UpscaleUnavailableError` | 4K upscale is gated to Flow **Ultra** accounts (HTTP 403) | Use `--scale 2k`, or upgrade the Flow plan |
|
|
1033
|
+
| `23` | `UiSelectorDriftError` | A Flow editor control could not be located — Google changed the frontend (issue #183) | Update gflow-cli; file a bug with the probe name + debug screenshot from the error message |
|
|
1034
|
+
| `24` | `BrowserEngineUnavailableError` | `GFLOW_CLI_BROWSER_ENGINE=patchright` but the engine is not installed | `pip install 'gflow-cli[patchright]'`, or unset `GFLOW_CLI_BROWSER_ENGINE` |
|
|
1028
1035
|
| `130`| SIGINT | User-interrupted (Ctrl-C) | — |
|
|
1029
1036
|
|
|
1030
1037
|
**Exit code 16 — data store / migration error.** Fires when:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "gflow-cli"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.19.0"
|
|
4
4
|
description = "Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { file = "LICENSE" }
|
|
@@ -58,6 +58,15 @@ s3 = [
|
|
|
58
58
|
chain = [
|
|
59
59
|
"av>=12",
|
|
60
60
|
]
|
|
61
|
+
# Patchright engine extra — opt-in, drop-in patched Playwright (Chromium) that
|
|
62
|
+
# avoids the Runtime.enable CDP leak on the headed path. Selected via
|
|
63
|
+
# GFLOW_CLI_BROWSER_ENGINE=patchright. Ships a PATCHED Chromium driver that
|
|
64
|
+
# handles live Google session cookies/Bearer/SAPISID, so it is EXACT-pinned and
|
|
65
|
+
# treated as a security-review-required bump (NOT a dependabot auto-merge) —
|
|
66
|
+
# see SECURITY.md. Not a headless unlock.
|
|
67
|
+
patchright = [
|
|
68
|
+
"patchright==1.60.1",
|
|
69
|
+
]
|
|
61
70
|
|
|
62
71
|
[project.scripts]
|
|
63
72
|
gflow = "gflow_cli.cli:main"
|