This release is a big push on identity unification and task scheduling robustness. Every user-owned entity (User, Agent, App, McpServer, Channel) now carries a Handle newtype, Policy principals are reshaped as {user_handle}/{entity_handle} under a User parent, and all storage and routing paths are keyed by handle. Tasks gain a required result_schema that drives how cron and one-shot results render back into source chats, with a fix for a long-standing CronRun crash-recovery race. The chat UI now paginates history on scroll-up and shows day separators with per-message hover times. Under the hood, Policy decisions and per-agent permitted tool sets are now cached, sandbox limits accept partial saves, and a Handle migration carries existing installs forward.
Supported channels: Slack, Discord, Telegram, Signal, SMS, WhatsApp Cloud, WhatsApp Personal.
Identity / Handles
- Add a
Handlenewtype with sanitization rules and a build-script-generated reserved-name list; renameUser.usernametohandleand requireAgent.user_id+Agent.handle. - Add
App.handle,Channel.handle, and renameMcpServer.slugtohandle; switch all four to handle-keyed paths. - Unify on-disk storage under
data/users/{handle}/{subsystem}with per-channel storage paths. - Switch Cedar entity UIDs to
Kind::"{user_handle}/{entity_handle}"with User parent; refactorSandboxPrincipalRefinto a struct + Kind enum and rewirepolicy::serviceaccordingly. - Update the Cedar schema, db init indexes, and add a
handle_unificationmigration (cutover at2026-05-24T00:00:00Z); dropseed_config_agents. - Reshape
CandidateEventto carry typedUser/Channel/Chat/Message/Contactreferences. - Carry user handle through the auth middleware and all API routes: admin/auth, agents, app proxy, files, MCP, browser, skills, tools, messages.
- Scope agent skills by
user_handle/agent_handle; update content + sandbox tools, the tool manager, and agent-affecting tools to use Handle paths. - Thread Handle through chat, channel, credential, notification, memory, and inference services.
- Refresh built-in agent prompts and the
manage_serviceprompt + manifest schema for handle-keyed URLs.
Tasks / Cron
- Add a
result_schemaclassifier and renderer for task result delivery; requireresult_schemaoncreate_task/create_recurring_taskand schema-drive source-chat delivery. - Plumb
result_schemathroughcreate_cron_template+spawn_cron_run; acceptcomplete_task.resultas any JSON value and validate against the schema. - Restrict
send_messageto the agent's heartbeat chat so tasks deliver throughcomplete_task.result. - Fix CronRun crash-recovery race by narrowing the orphan query and reordering
resume_all. - Thread
space_idthrough cron templates so CronRuns deliver into the right space. - Wrap the initial task instruction in
<task>regardless of authoring agent. - Hide task-execution chats from the navigation space view; demote empty task-completion history rows from warn to debug.
- Remove the unused
SCHEDULED_TASK.mdprompt; advertise recurring digests and briefs as researcher responsibilities.
Chat / Frontend
- Load older chat messages on scroll-to-top and merge historical messages with SSE-buffered ones when loading a chat.
- Show day separators, conversation gaps, and per-message time on hover.
- Split auth, navigation, and session contexts; replace
AuthGuardwithAppGate+RequireAuthand rewire auth/setup/main layout for the new gating model. - Route apps, notifications, and settings by handle; switch main pages and the conversation panel to the new context APIs; update types and the api-client for handle-based responses.
Channels
- Skip
setWebhookwhen the URL is already ours and drop the queue when replacing a stale URL. - Warn when an inbound webhook arrives for an unknown channel.
- Store
Channel.idas a bare UUID instead of a SurrealDB record literal. - Cover channel-delete with a test that asserts the spawned task is cancelled and
on_disconnectruns.
Policy / Performance
- Add a policy decision cache with prefix-scoped invalidation.
- Cache per-agent permitted tool sets to cut
/api/agentsfrom O(N·M²) to O(N·M).
Sandbox
- Smooth tracked CPU via EWMA to absorb transient bursts.
- Fill missing sandbox limits with server defaults on partial save.
- Fix
sandbox_cacheinvalidation by aligningcache_keytouser_id.
Build / Infra
- Add a docker task for publishing prod images to a personal preview registry; share constants/helpers via
common.shand annotate the image index for GHCR. - Persist cargo registry and git caches across dev container restarts.
- Send a
User-Agentheader on crates.io requests inupdate-versions; bumpsmbclientanduvpackage pins.