- 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>
67 lines
2.5 KiB
Markdown
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"}`.
|