flow-extension/README.md
type-two 501431bf59 Flow rinse: browser downloads, fast-fail, autoStart, launcher + self-healing launchd
- background.js: chrome.downloads via page session (no CSP/base64)
- content.js: fast-fail on Flow error banner, image vs video timeouts, autoStart
- local_server_example.py: /enqueue + /save, downloads/ output, resume-skip
- launch.sh: idempotent server-up + caffeinate + single-tab focus
- install.sh + plist: self-healing agent every 10 min (TCC-safe App Support copy)
- flowclient.py: enqueue/wait_for helper for game projects
- README: full setup + macOS TCC gotcha

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 01:20:32 +10:00

67 lines
2.5 KiB
Markdown

# Flow Auto-Pilot
A Brave extension + local queue that drains a prompt bank through Google Labs
**Flow** (Nano Banana 2 images, Veo videos) on the webui-only credits you can't
reach via API. The extension types prompts into the Flow agent box with
**trusted CDP input** (Flow ignores synthetic DOM events), waits for the media
grid to grow, harvests the new asset URLs, and downloads them with the page's
session cookies.
Not headless: Brave must be running and logged into the Flow account. But once
the tab is open with **Auto-start** ticked, it runs unattended.
## Parts
| File | Role |
|---|---|
| `manifest.json`, `background.js`, `content.js`, `popup.*` | the Brave MV3 extension |
| `local_server_example.py` | queue server on `:8017``queue.jsonl` in, `results.jsonl` out |
| `queue.jsonl` | the prompt bank (one task per line) |
| `flowclient.py` | `enqueue()` / `wait_for()` so a game project can request assets |
| `launch.sh` | start server + keep Mac awake + open/focus one Flow tab |
| `install.sh` + `games.monsterrobot.flowrinse.plist` | self-healing launchd agent |
## Run it by hand
```
./launch.sh https://labs.google/fx/tools/flow/project/<PROJECT_ID>
```
Server comes up (under `caffeinate`), Brave focuses the Flow tab, and with
Auto-start ticked the rinse begins. Files land in
`~/Downloads/flowrinse/<category>/`.
## Run it unattended (launchd)
```
./install.sh
```
Fires `launch.sh` at login and every 10 min. Because `launch.sh` is idempotent
(port check + tab reuse), the repeat runs are no-ops that self-heal a dead
server or a closed tab.
**macOS TCC gotcha** (same as the vault-backup job): launchd can't execute
scripts inside `~/Documents`, so `install.sh` runs a **copy** at
`~/Library/Application Support/flowrinse/`. That copy owns the live
`queue.jsonl` / `results.jsonl` / `downloads/` once the agent is running.
Re-run `./install.sh` after editing `launch.sh` or `local_server_example.py`
to resync the copy. First run pops one Automation prompt (allow control of
Brave) — click Allow on the rig's screen.
```
launchctl kickstart -k gui/$(id -u)/games.monsterrobot.flowrinse # run now
launchctl bootout gui/$(id -u)/games.monsterrobot.flowrinse # stop it
```
## Enqueue from another project
```python
from flowclient import enqueue
enqueue("Sierra EGA record-store back room, 160x168, 16-color",
kind="image", category="morp2_bg")
```
Or over the wire: `POST http://localhost:8017/enqueue` with
`{"prompt","kind","model","category","dest"}`.