v0.4.0
Production hardening for real deployments
PII redaction before any provider call. Enable builtin patterns (card, email, phone, aadhaar, ssn) plus your own regexes; only the masked copy reaches the LLM, while sessions, audit, and human handover keep the true transcript.
app = AgentApp.from_config("agents/", redaction="policies/redaction.yaml")Provider resilience. Transient 429/5xx and transport errors retry with bounded backoff (honoring Retry-After) instead of escalating a customer. model: config gains base_url and timeout for in-house gateways, with per-gateway connection pools.
zolva serve. Reference HTTP entrypoint for channels: HMAC-verified POST /channels/{channel}/{agent}, /healthz, behind the existing [dashboard] extra. Config to a running webhook endpoint in one command.
Human loop, closed. AgentApp.resume() records a teammate's resolution as an audited resume step and a session note, so the agent knows the outcome when the customer returns. Exposed as HMAC-verified POST /sessions/{agent}/resume.
Per-customer contact caps. Pass customer_ref on run() or channel payloads and cap contact frequency across sessions and channels in policy:
post:
- block_contact_frequency: { max_contacts: 3, window_hours: 168, ledger: contacts.sqlite }Pluggable audit storage. The hash chain now sits on the four-method AuditStore protocol (SQLite default, in-memory reference; Postgres is the same four methods). verify() stays full-from-genesis by default; monitors use verify(incremental=True) with a periodic full pass, exactly what the dashboard does.
240 tests, mypy --strict, ruff, bandit clean.