v0.1.5 — the Studio becomes an agentic studio
The largest release so far: a rebuilt UI, live browser embedding, take-control, and
co-planning. v0.1.4 made tasks run; this one makes them watchable, steerable and
reviewable before they start.
Plan before anything runs
Give it a goal and an orchestrator model (Qwen/Qwen3.6-27B-FP8) drafts a plan: ordered
steps, the landing URL, and the egress allow-list. You edit it — reorder, rewrite, delete
steps — and only on approval does a browser open. microsoft/Fara1.5-27B still executes;
it is a grounded computer-use model, not a planner, and asking it to plan is
off-distribution.
The approved plan is authoritative. Delete the "submit the form" step and the form is
not submitted. That sounds obvious and was not: the first implementation put the original
goal ahead of the plan, so the agent still submitted because the goal text said to. If
editing a plan does not change behaviour, reviewing it is theatre.
The planner also flags irreversible actions ("Submitting the form") as risks the agent
must stop and ask about.
The browser is now inside the app
The agent's real Chromium renders in the right-hand panel while its OS window stays out of
sight. Not a screenshot poller and not a second browser — a CDP screencast of the actual
page the agent is driving, ~12 fps at ~95 KB/s.
- Detach / attach — pop the real window back onto your desktop and hide it again,
with no page state lost. - Take control — pause the agent at its next safe point, click and type in the page
yourself, then hand back. Control is exclusive: input is refused while the agent still
has it, and held modifiers are released on hand-back so the agent's next click is not
a shift-click.
Credential pages are protected. A screencast is a compositor capture, so it bypasses
the vault masking that lives in the observation path. On any page with a password field
the raw stream is suspended and frames come from the already-masked path instead, badged
"masked · reduced rate" — never a silent slowdown. It fails closed, and it holds whether
the agent or a human is driving.
Live, not polled
Runs used to be opaque while they happened: the agent loop ran to completion internally,
so the UI showed a stale step count until it finished. Now every step streams.
Streaming is a sidecar capability, not a GUI one:
infinia-qa watch <task-id> # live progress in the terminal
ffplay ".../live.mjpeg?token=$TOK" # the browser, in any playerinfinia-qa watch follows a run live with no token plumbing, so opencode or Claude Code
driving the CLI get the same view the app does. There is also a WebSocket for events and
one for binary frames.
The stream is authenticated — a per-launch token, plus an Origin check. Loopback
alone is not enough once a socket can show your session and type into it.
Rebuilt UI
React + Vite + Tailwind, in the two-column layout: plan, sessions, agent stream and
composer on the left; the browser on the right; diagnostics, approval inbox and
replay collapsed at the bottom. The old renderer rebuilt its whole session list every
2.5 s, discarding scroll and hover, and stole your cursor in the approval box on every
poll. Both gone. A real CSP replaces the previous null.
Fixes worth naming
- Replay was off by one — it showed the previous step's screenshot. Action i
producesscreenshot_{i+1}_post.png; verified against the solver log. - Replay never rendered at all in a packaged app — the screenshot reader resolved
paths from the working directory, which is/for a Finder-launched app, and returned
a shape the UI could not read. - Dry-run used to work by prefixing the goal with
"[DRY-RUN] ", which the agent read
as part of its instructions. It now uses the real API flag. - The sidecar's own dependencies (
fastapi,uvicorn,websockets) are declared rather
than present by accident of install order.
Install
curl -fsSL https://infinia-automation-studio.adid.dev/install.sh \
| INFINIA_TF_BASE_URL=https://api.tf-staging.iamsaif.ai/v1 \
INFINIA_TF_API_KEY=tf-your-key-here \
bashKnown limits
- Multi-tab is not in. Every tab must be created on the same browser context or it
escapes the egress fence, and keeping background tabs alive is a containment change —
both deserve a decision, not a rushed implementation. - Attach leaves a small corner of Chromium visible at the screen edge. macOS clamps
off-screen window moves, and the alternative — minimising — breaks the agent's own
screenshot path. - Plans execute in one shot. The approved plan governs the run, but there is no
per-step progress or automatic replanning yet.
290 tests pass.