MASAgent workspace

Changelog

Only the changes you would notice

Hand-picked, not an auto-generated commit feed. Newest first, every entry links to its pull request, and breaking changes are called out.

Quota gate for the public pool: 20,000 tokens a day, then a prompt to add your key

The public model is now a read-only config, backed by a usage ledger with daily rollups. The quota gate and a global budget breaker ship together, and settings hot-reload without a restart.

LLMBilling#594#588

Row-level tenant isolation: tenant_id plus PostgreSQL RLS across every table

Sessions, messages, configs, skills and sandbox ownership all carry a tenant_id, and isolation is enforced in the database. Every id-based entry point now asserts tenant ownership and returns 404 at the boundary.

Security#571#580

Envelope encryption for secrets: one DEK per record, rotatable KEKs

Model keys and MCP tokens are encrypted before they reach storage, with a versioned, key-id-tagged format. The API returns masks only, logs and audit entries redact the same fields, and backfill plus rotation scripts are included.

Security#577#578

Runtime hardening: bounded pools, per-tenant rate limits, graceful shutdown

Long-lived connections no longer grow without a ceiling and each tenant is rate-limited per window. Rolling releases drain traffic first, so running sessions are not cut off mid-turn.

Runtime#579

Sign-in moved to Clerk, with a dedicated tenant on first login

Login page, session exchange and disabled-tenant blocking all changed together. A Clerk mirror webhook plus a daily full sync means profile edits show up without waiting for the next sign-in.

Docs split into internal and public products; bilingual docs site shipped

Internal docs stay in the repository and never enter the build; public docs gained frontmatter gates, zh/en file parity checks and a sensitive-content scan.

Docs#550

Full history: GitHub commits; RSS: /rss