Repository navigation
v0.2.0
What's New
SSE Event Streaming with Replay (#20)
- Live event streaming —
GET /runs/{run_id}/streamdelivers real-time SSE events as the agent executes each step - Full replay on connect — connecting mid-run or after completion replays all past events first, then continues live
Last-Event-IDreconnection — standard SSE reconnection support; clients skip already-seen events automatically- Event persistence — run status and action log are persisted to Modal Volume on completion, so
GET /runs/{run_id}andGET /runs/{run_id}/streamwork even after the sandbox terminates - In-process status API — fixed a pre-existing bug where the status API (uvicorn) and agent ran as separate processes with no shared state, meaning SSE streaming never actually delivered events
Multi-Container API Support (#20)
Sandbox.from_id()fallback — status, stream, and stop endpoints reconstruct sandbox handles from Modal's API when the run isn't in the local registry, enabling multi-container deployments without sticky sessions- Volume-backed fallback — after sandbox termination, responses are served from persisted
status.jsonon the recordings volume
Credential Security (#18, #19)
SecretValuewrapper — credentials are wrapped in an opaque type that masksstr()/repr()output and blocksjson.dumps(), preventing accidental exposure in logs- HTTPS + Modal encryption — credentials flow over TLS to the API, then via Modal's encrypted env vars to sandboxes
- Flat credential format — simplified from nested
dict[str, dict[str, str]]to flatdict[str, str]
Local Evaluation Framework (#17)
- Offline test stabilization — all 350 tests run without API keys or network access
evaluation/module — new eval runner, models, and example suite for measuring task success, action count, and output qualityscripts/eval_local.py— CLI to run eval suites locally with JSON report output- CI workflow — added
.github/workflows/ci.ymlfor automated testing
API Improvements (#16, #20)
RunStatusValueandRunPhaseasStrEnum— type-safe status values replacing rawLiteralstringsRunResponse.statusfield — POST /runs response now includes the run status- API key authentication —
api/auth.pywith Bearer token verification,ENVIRONMENT=localto disable for development - Safe
Last-Event-IDparsing — malformed headers default to 0 instead of raising errors
Documentation
- Streamlined README — focused on setup, quick start, and why CUA is different (~120 lines, down from ~600)
docs/directory — 8 focused guides: API, Tools, Playbooks, Authentication, Guardrails, Recording, Observability, Configuration
Breaking Changes
config.credentialsnow returnsdict[str, SecretValue]instead ofdict[str, str]— use.get_secret_value()to access raw valuesRunStatusValueis now aStrEnum(compares equal to strings, so most code is unaffected)
Stats
- 50 files changed, 2,260 insertions, 663 deletions
- 350 tests (all offline, no API keys required)
- Deployed and validated end-to-end on Modal
Full Changelog: v0.1.0...v0.2.0