Repository navigation
v0.10.0 — EvenDrive, standardized Control editing, hardened LLM path
A minor release, led by EvenDrive, standardized Control editing, and a hardened LLM request path. 674 non-merge commits since v0.9.0. No breaking changes.
EvenDrive and the Desktop file explorer
The Desktop sidebar gains a GFS file explorer tree, and files open as previews in a workspace tab (single-click opens the preview). The Files view is renamed EvenDrive, with an active-folder breadcrumb menu, a file-list scroll fix, and inherited file permissions with a parent-folder update flow (#697, #658).
Standardized Control editing
Control UI and profile-ui move scalar, relationship, and document edits onto shared edit-dialog primitives: team rename, member contact and add dialogs, agent names, identity documents (with Markdown preview), model configuration, GFS rename, channel credentials, and approval preferences (#775).
Control admin invitations that replace the inviter
A control admin invitation can carry replaceInviter. Accepting it retires the inviting admin in the same transaction, revokes their paired desktop invitation, and preserves team access through the hand-over (#860).
LLM request path
- Provider families are declared and subscription catalogs reconcile against the vendor, with an opt-in periodic sync (#732).
- Context is counted in bytes, the request cap rises to 8 MiB, and size refusals are classified (#739, #731).
- Streams get a 30 min per-attempt cap with a typed idle timeout and SSE keepalive; the queue-wait bound runs on its own timer (#748, #776).
- Upstream 429/4xx and control-plane outages return distinct codes, and a control-api that is unreachable during a restart surfaces as
503 control_plane_unavailablefrom the nginx gateways (#821). - Codex and Grok contracts rise to 256 tool calls and 1024 messages; the tool-call limit reports as a contract refusal, not an outage (#685, #728). Codex preserves and authorizes image input (#660).
GFS, workflows, and hardening
- Every GFS rate-limit denial is reported, Desktop budgets are sized, and the agent-plane limit is enforced; Desktop stops spinning on read rate limits (#766, #702). Bounded image reads are preserved as model input (#670).
- control-api constrains Secret types and annotation keys on write, driven by a per-CRD Secret-reference contract (#252).
- web-search validates fetch destinations against SSRF and bounds
fetch_pageresources (#608). - WorkflowRecipe and HCC reconcilers read before writing NetworkPolicies, headless Services, and policies, and back off policy-pending requeues (#773, #769, #752, #695).
Upgrade notes
All 9 CRDs change — apply charts/clerum-crds before the app. Each CRD gains a clerum.io/secret-reference-contract annotation; the schemas themselves are unchanged. control-api reads this annotation and fails Secret-reference writes with Missing Secret reference contract if it is absent. Deploy with gcp-prod-deploy-crds (or the equivalent for your cluster) ahead of the workload rollout.
deploy/base changes only in control-plane: codex-llm-proxy and grok-llm-proxy raise memory to 768Mi/1Gi, cap the V8 heap, extend terminationGracePeriodSeconds to drain admitted 30 min streams, and derive MAX_BODY_BYTES instead of setting it. The subscription catalog sync ships disabled (SUBSCRIPTION_CATALOG_SYNC_CRON_ENABLED: "false"). No new services, RBAC, or ServiceAccounts, so no post-deploy RBAC sync is needed.
Images
Release images are promoted, not rebuilt — release-images.yml copies the exact digests already proven on :latest into :v0.10.0, so they are byte-identical to what was tested.
Pull by tag, or pin by digest:
ghcr.io/evenfire-ai/<image>:v0.10.0
The same set is attached to this release as release-images-v0.10.0.json, so a deployment can consume the digests directly rather than scraping this table.
| Image | Digest |
|---|---|
airtable-mcp-server |
sha256:9f1b6cd4f11aa47229d942973dde9ef463896c3d854efe0a97c92dfb4ce625c0 |
channel-reader |
sha256:34c0a9c94b27159552600aea3ee6d309033f320a5ca225311f04ce3fdd8614b7 |
clerum-workflow-base |
sha256:99fad490416e116bb442e74b8996f063fcba66485b072e36b262a8a080460b2c |
codex-llm-proxy |
sha256:b9031aa7d11a26bdd66b98e7ee0a2a84e0344ae7163cde6ea1ff5c2c2eee999d |
control-api |
sha256:797d09aa53b983d3161da52dc6fdb04a354b2c96f107491c8e6f77e2a6a8234f |
control-ui |
sha256:8ec21ecba83d1a5aba18e0bc2594cc939c54cf3dfe783aa345a423f8be1a45ee |
external-rest-api |
sha256:076c0def450ea79223f3b172e6f1aaf3e2767eadc31b8f4dbb872b8b8aae0d62 |
gfs-controller |
sha256:39ae7c450b756fefb3a63633683ecfe438fe38a8ba5e24da5f6ccea5099731eb |
grok-llm-proxy |
sha256:172e17543b448e135668df37e669d1c76215348e6a487986eb9ed3accd364f20 |
host-context-controller |
sha256:2daa06c2b0b2309de624c49222d3118d103afb6dd751c63d88388347bf0d1935 |
mcp-host |
sha256:5945443eaa10972443a95ce3ddc7714c3a01717f1dd7dc313d814a8f1de20654 |
mcp-host-desktop |
sha256:72fd78c13672d860bc72dc9c10382d1f0cfaef367409a654f747df1783ec83a2 |
mcp-host-full |
sha256:9815658bf536d4ce29f68d7668d24d2a187e484eb4d8d1152ff9f5ab1de2a3fc |
mcp-host-slim |
sha256:77b405672c8071f57d798b7bcc8d06736a2072ae34ecbe74781fa34095c2026b |
mcp-proxy |
sha256:092b5c8a2a34c3c8a46954ba489daa7ca740f13d1815d11d65311231e671d6b2 |
mock-mcp-server |
sha256:caac410b30133c21d110544996f5cdb7f71462d08411d8df5654da853516e007 |
mock-stdio-mcp-server |
sha256:7fc0bca8f6dbfcefe16810602a8596b1f198125eae794ef144f84d2300bccce5 |
nginx-egress-proxy |
sha256:4d677d4ce64afb1055b539e0aac5bafad85c2aaa2adc55de555bb07de3d09edd |
playwright-server |
sha256:e1b7568078b53d0522dbdc3c3f16d4457ed1808461b7e92aaa2f751844af6a28 |
profile-ui |
sha256:5f94d5ac671aecbc08bf03ac572a155ae9f2a5ff8f95820cc6b6f8d4d1b5c57c |
rpc-proxy |
sha256:ef6fbe71a7b4d73a7adaf08e59acf2c26ae8c6152de54427038c7bd2b1779853 |
stdio-bridge |
sha256:f47925d0af73384348074cfe480eb778772f194bde8e40c6b0de04de9c6474fa |
web-search-mcp |
sha256:38f3e3dea9640b7345b7dddc7c56f80b0e27bcc6f118df931742d15e641adace |
webhook-gateway |
sha256:87514e276e58fcbce62e7ead80686001c042c00b11432f5323a51e90a6e947a5 |
webhook-proxy |
sha256:c2c5fa27adf81ddab9dade72e3ffa9b961477570f1d373b9ab149feee6e4c693 |
workflow-approval-request-reader |
sha256:f041d5946a9e7f8f6860f0053a86b355f5ca62c5d5fc5ac1c735fbec015b2310 |
workflow-coordinator |
sha256:93529f683e5794c8e057e29f4dfb5995d635fa8e15b670a405ebc1feca70d161 |
workflow-recipes |
sha256:a079416e20b96cfd79c9fad356a6ec94acac5fa218403119caecc2c16de68ea1 |
workflow-snippet-runner |
sha256:ea6ea55d06ebb35f1ba498729210867ff7043200221b35c8ef29bb86e880a386 |
workspace-files-controller |
sha256:82b0edd2d2085094d835c15a91e7d11a0e68694413ac7d996227824864b95806 |