v0.0.427
·
2490 commits
to main
since this release
Version 0.0.427 (June 28, 2026)
- Reports sidebar sorts by last activity (#479) — the report list (sidebar and
/reports) now orders by real conversation activity (is_starred DESC, last_activity_at DESC) instead of creation date, so an active chat moves to the top. Backed by a new denormalized, indexedreports.last_activity_atcolumn bumped at two coarse choke points (new user message, agent turn finalize) and backfilled fromMAX(completions.created_at), keeping the list read cheap (no join to the high-volume completions table). The sidebar "REPORTS" header now links to/reports. - Run scheduled prompts on demand (#474) — a new Run now button in the scheduled-prompt modal triggers a scheduled prompt immediately without waiting for its cron, via a new
…/scheduled-prompts/{id}/triggerendpoint. Manual runs useforce=Trueto bypass the cross-worker claim and theis_activepause check, are restricted to the prompt owner (404 for missing, 403 for unauthorized), persist any unsaved edits first, and navigate to the report to watch execution. Localized across all 10 locales. - Global Evals in the /agents tree (#478) — a new Global Evals entry below Skills in the Knowledge Explorer surfaces org-wide test cases (those scoped to all agents) in one place rather than only inside each agent's Evals panel. Admin-gated by
manage_evals, with per-agent-only controls (reliability badge, Self Learning, "Run evals now") hidden in global mode. Client-side filter only — no backend changes. - Audit coverage for prompts, RBAC, webhooks, OAuth & more (#466) — closes the high-priority gap where ~75 state-changing endpoints emitted no audit trail. Adds best-effort, route-level
audit_service.log(...)calls (capturing IP / user-agent, wrapped so an audit failure never breaks the request) for prompts, scheduled prompts, RBAC (roles, groups, memberships, role assignments, resource grants), webhooks, OAuth clients, usage policies, and external user mappings. Action types are discovered dynamically by the audit UI, so no registry change is needed. Addsdocs/design/audit-trail-coverage.mddocumenting the full inventory and deferred follow-ups. - Fix — report title sometimes never set on Postgres (#475) — the auto-generated report title was written by a fire-and-forget
asyncio.create_taskthat got garbage-collected before its LLM call returned (worst on Postgres, where the pooled connection recycles the instant the response completes), leaving reports stuck onuntitled report. Title generation now runs inline so the DB session stays alive, and is gated on the title value (empty/placeholder) rather than "first completion" — making it self-healing across turns. The sidebar also live-updates the title in place (with a fade-in) via areport:updatedevent instead of waiting for the next navigation. - Fix — notification inbox order + never blank on a bad row (#477) — the inbox could show a non-zero unread badge over an empty "all caught up" panel when the list endpoint 500'd on a single malformed row, and (when items showed) sorted severity-first so stale high-severity rows outranked fresh ones. The list now sorts newest-first (severity only as a tiebreaker), swallows unrepresentable timestamps, falls back to DB ordering on any sort error, and serializes each row independently so one poison row degrades to a placeholder instead of blanking the list. The frontend now shows a "Couldn't load / Try again" state instead of masquerading a failed fetch as an empty inbox.
- Fix — slow /agents instructions load (#476) — the Instructions tree-pane could take a minute+ on large orgs because
get_pending_change_instruction_idsran an N+1 (review_hunks()once per pending instruction org-wide, ~8 SQL statements each). Replaced with a fixed set of bulk queries plus an in-memory diff pass — byte-for-byte identical results with the same per-hunk rules. Measured on a 600-instruction seed: 4801 → 4 SQL statements and 5.41s → 0.28s service time. - Fix — TraceModal outer scrollbar clipped summary badges (#473) — incomplete cancellation of the UCard body padding pushed the trace modal past its fixed height, adding an outer scrollbar that overlaid the summary strip and clipped the right-aligned LLM-judge score badge (
Resp x/5). Removes the card body padding (matchingBuildExplorerModal) so the modal no longer overflows. Template-only. - OpenShift (OCP) deployment fixes (#468) — removes the redundant file-based log handler (
RotatingFileHandler→logs/app.log), which broke under OCP's read-only root filesystem; logs now go to stdout/stderr only (12-factor). Also disables asyncpg SSL auto-detection for unconfigured connections (ssl_modeunset →ssl=False), preventing the~/.postgresql/client-cert lookup that failed with "Permission denied" under OCP's arbitrary-UID pods. No breaking change:ssl_mode: require/verify-fullbehave as before.