The backlog release — six new messaging channels (13 total), a document-ingestion knowledge base, outbound webhooks with lifecycle events, budget enforcement, Composio/Nango app connectors, and a wave of management UIs.
Features
Messaging channels (6 new → 13 total)
- #376 Microsoft Teams — Bot Framework adapter; inbound
Activitywebhook at/webhooks/msteams, AAD client-credentials token for outbound replies (reply target encodesserviceUrl|conversationId). - #377 iMessage (BlueBubbles) — iMessage backed by a self-hosted BlueBubbles server on a Mac;
new-messagewebhooks in, RESTmessage/textout, replying to the chat GUID. - #375 Google Chat — space-scoped adapter; service-account JWT-bearer assertion exchanged for an OAuth2 token, outbound
POST /v1/<space>/messages. - #374 Feishu / Lark — event-subscription v2 with the
url_verificationhandshake andim.message.receive_v1text events; Verification-Token check. - #372 Mattermost — inbound via outgoing webhook, outbound via REST v4
POST /api/v4/postswith a bot token; secure-compared outgoing-webhook token. - #373 LINE — Messaging API adapter;
X-Line-SignatureHMAC verification, audio messages downloaded and transcribed via STT. - #391 Edit/delete message support —
edit_message/delete_messageon the base adapter, implemented for Discord and Slack; recordsplatform_message_idon send.
Knowledge & research
- #378 Document-ingestion knowledge base (RAG) —
KnowledgeDocument+KnowledgeChunkmodels,KnowledgeIngestionJob(extract → chunk → embed), agent-scoped vector retrieval denormalized likeMemoryEntry. - #383 Knowledge Base UI — upload files or paste text, ingestion status + chunk counts; wires the already-shipped model, job, and search tool to a real UI (agents were searching an empty index).
- #385 Research sessions browser —
/researchindex + report view forDeepResearchJoboutput, rendered with a thin client-side markdown Stimulus controller. - #384 Per-agent memory UI — browse/search/delete an agent's memories at
/agents/:slug/memories, replacing the hardcoded latest-20 list on the agent page.
Outbound webhooks
- #379 Signed event delivery —
WebhookEndpointmodel (https-only URL, encrypted HMAC secret, subscribedevent_types, agent/team/global scoping) +WebhookDeliveryJob, reusing the inbound HMAC scheme. - #390 Endpoints management UI — CRUD at
/webhooks_out; secret generated server-side and shown exactly once on create. - #398 Lifecycle events — emits
session.started/session.completed,agent.created/agent.deleted, andheartbeat.completed.
Budgets & analytics
- #386 Budget enforcement in LLM execution —
Budgets::Checkruns before every dispatch (ChatStreamJob,TeamChatJob,Sessions::Chat); over-budget agents are blocked with a visible error, spend is recorded on each completed call. Agents with no budget stay unlimited. - #397 Cost dashboard trends + budget-threshold webhooks —
?days=7|30|90range filter, daily cost/token bar chart, per-agent error-rate column (no N+1), and budget-threshold webhook events.
Integrations & tooling
- #411 Composio & Nango app connectors — new
composiotool (v3 REST:list_toolkits/list_tools/list_connections/execute+ rawrequest) andnangotool (proxy+list_connections/list_integrations); vault-backed credential cards on the Integrations page. Nango injects OAuth tokens so agents never handle credentials. - #382 Tool requirements moved to DB — new
requirements jsonbcolumn ontools, editable from the tool form without a deploy; falls back to the constant for unseeded rows.
Admin UIs & navigation
- #393 Unified approval inbox —
/approvalslists all three human-in-the-loop flows (ApprovalRequests, vault write confirmations, skill-update proposals) with Approve/Reject. - #392 API token management — mint/list/revoke at
/api_tokens, plaintext shown exactly once. - #389 Session timeline/replay —
/sessions/:id/timelinemerges transcript messages, tool executions, and LLM calls into one chronological, expandable view with session totals. - #395 Sidebar navigation — Research, API Tokens, Webhooks, Knowledge, and Approvals links; Approvals carries a live pending-count badge.
Fixes
- #410 XSS — replace regex sanitizer with DOMPurify (security) — all four markdown entry points now sanitize
marked.parse()output with DOMPurify. The old regex missedjavascript:URLs and<svg/onload=…>-style handlers, and rendered markdown can carry content forwarded from external channels and knowledge docs. - #409 WhatsApp webhook secret mismatch —
verify_webhookgated onapp_secretbut the HMAC usedwebhook_secret, so legitimate webhooks were rejected in one config and verification was bypassed in another; also removed a dead connection-refused rescue. - #381 Signal webhook token verification —
verify_webhookwas a stub that always returnedtrue; now secure-comparesX-Signal-Webhook-Tokenagainst the channel secret (permissive only when unset). - #371 Auto-title saved the model's identity reply — the Haiku title model treated the transcript as a turn to answer, saving "I'm Claude, an AI assistant…" verbatim as the title; fixed with a dedicated titling path.
- #380 Repair test suite (55 failures on main) — fixed 2 real bugs (Ollama context-window shadowing the tag-specific limits, async HeartbeatJob) plus stale specs that were blocking every PR from going green.
CI / Chores
- #388 Specs for the Discord + WhatsApp adapters (51 examples)
- #387 README channel count → 13, drop unused
DevicePairing, swarm-import placeholder warning - #359 Docs: clarify Signal is an inbound inbox, not a self-text channel
- Dependency bumps — #354 anthropic 1.36 → 1.43, #353 image_processing 1.14 → 2.0.1, #352 bootsnap 1.23 → 1.24.5, #338/#400 oj 3.17.0 → 3.17.3, #337/#402 selenium-webdriver 4.43 → 4.45, #336/#399 faraday 2.14.1 → 2.14.3, #335/#403 neighbor 1.0.0 → 1.2.0, #333 devise 5.0.3 → 5.0.4, #332 sidekiq-cron 2.3.1 → 2.4.0, #327/#401 puma 8.0.0 → 8.0.2, #408 concurrent-ruby 1.3.6 → 1.3.7, #407 thruster 0.1.20 → 0.1.22, #406 kamal 2.11 → 2.12, #361 codecov-action 6 → 7, #362 actions/checkout 6 → 7
Full Changelog: 2026.06.03-rc...2026.07.01