v0.0.428
·
2379 commits
to main
since this release
Version 0.0.428 (June 29, 2026)
- File references + MCP file materialization (#497) — adds a
file_referencemodel/route/service and materializes files surfaced by connector tools (MCP resources, Graph mail attachments) so they can be referenced as first-class files. Wires file materialization intoexecute_mcp/read_mcp_resource/ the MCP client and adds a Graph mail client path. Backed by two migrations (filesrc01adds a file source-kind,fileref01adds the file-references table), chaining off the service-accounts head. Adds unit tests for the reference service and MCP file materialization. - /agents tree — lazy-load instructions + server-side search (#494) — the Agents tree no longer loads all instructions on mount (
GET /instructions?limit=200) and derives everything client-side. It now draws from cheap aggregate counts and loads rows lazily on expand. New backend endpoints:GET /instructions/counts(badge aggregates with no row hydration, same visibility filter as the list),GET /knowledge/search?q=(cross-entity grouped search over agents + instructions), and an?global_only=truelist filter. The frontend mounts with counts + agents only, lazy-loads rows per group/agent on expand (with per-node spinners), turns "search everything" into a grouped server-side results view, and keeps a deduped lazy row cache. Validated withtests/e2e/test_instruction.py(17 passed). - Prompts tools in Training mode (#495) — the training-mode agent can now curate reusable Prompts the same way it curates Instructions, via three new agent tools (
create_prompt,edit_prompt,search_prompts, allallowed_modes=["training"]) surfaced as rich, localized tool cards. Unlike instructions, prompts go live immediately (no draft/approval build) by writing thePromptrow directly viaPromptService, and authoring is governed by the agent-manager (manage) tier from #489 —create/updatealready requiremanageon each target agent (or org admin forscope="global"), so the tools inherit that gate with no new permission. New tool-card components mirror the instruction cards (scope/starter/param badges,{{param}}chips, Live state, "Open in Prompts"); localized across all 10 locales. - Service accounts for API use (#493) — adds service accounts: non-human, org-managed API principals for automation/integrations, with their own RBAC role and API keys, owned at the org level (survive offboarding) and not tied to a person. A core (non-EE) capability gated by a new
manage_service_accountspermission (covered byfull_admin_access). Implemented as aServiceAccountrow backed by a hiddenusersrow (is_service_account=True,is_active=False), so existingusers.idFKs / ownership / RBAC work with no attribution migration; org binding lives on a dedicatedservice_accountstable so an SA consumes no license seat and never leaks into member lists. Login (JWT/SSO) is blocked while API keys keep working; aforbid_service_account_principalguard prevents a leaked SA key from minting keys, creating accounts, or assigning roles, and role assignment is capped to the creator's own permissions. New Service Accounts sub-tab under Settings → Members. Alembic migrationc2d3e4f5a6b7. - Agent-manager RBAC tier (#489) — a per-agent
managegrant is now the "agent-manager" tier: a non-admin who owns or is grantedmanageon an agent can fully manage that agent — its tables, instructions, entities, evals and members — while staying scoped to their own agents.managenow impliesmanage_instructions/create_entities/manage_evals/manage_members(+view/view_schema) on the same data source (not org-wide), the three table-mutation endpoints move from the read-tierview_schematomanage, and global instruction/entity creation stays gated on org-levelmanage_instructions/create_entities. Mirrored in the frontend (usePermissions, table/tools editing UI, and an agent settings panel that highlights the current user's effective role). Also adds per-connection RBAC grants (manage_connection/ create / manage-agents) so a connection owner or grantee can manage that connection's config and build agents on it — surfaced in the role editor and the create-agent connection dropdown, with backend resolver support and e2e coverage. - Agent admins publish their own agents' instructions live + pending changes visible in the tree (#489/#494 follow-up) — instruction publish was gated only on org-level
manage_instructions, so an agent admin's create/edit on their own agent was staged as a pending non-admin proposal and never reached the main build, leaving it invisible in the lazy/agentstree (and spamming admins with review notifications). The auto-publish decision is now data-source-scoped: an agent admin (per-agentmanage) auto-approves + promotes builds scoped entirely to their own agents (org admins still publish anything; authoring an org-wide global instruction stays an org-level capability). Separately, the tree's lazy list and counts now surface instructions that are still awaiting approval (e.g. AI/training suggestions) — rendered with an amber "Pending review" dot + chip and a "not live yet, waiting for approval" tooltip — instead of hiding them. The agent's runtime instruction set is unaffected (it reads the main build directly). - External MCP tool gateway (#487) — BoW's external MCP server (
/api/mcp) can now act as a gateway in front of each agent's connected MCP servers and custom APIs, letting an external MCP client discover and trigger those tools through BoW alongside the existingcreate_data/inspect_datasurface. NewConnectionToolGatewayservice resolves an agent's tools and computes effective enable/policy from the per-agent overlay (allow-only over the gateway); newlist_agent_tools(discovery with full input schemas) andexecute_mcp(invocation) MCP tools;get_contextnow advertises each agent's tools plus atools_hint. - Gate low-confidence notifications (#486) — the
low_confidencereview producer fired on every answer scored below 3/5, which felt like it triggered on nearly all prompts. Alow_confidencenotification is now only surfaced once an agent accumulates 5 answers scored below 3/5 within a rolling 7-day window; below the floor the low score is tracked silently via the completions ledger. Per-agent dedup and dismissal/resurface behavior are unchanged. - Release DB connection before serialization on hot reads (#485) — every authenticated request held one pooled DB connection for its entire lifetime (across response serialization too), so a burst on the
/agentspage could exhaust the pool and stall every endpoint at a uniform ~10s. Addsrelease_request_db(db)and calls it at the end of the hot read handlers (/reports,/instructions,/instructions/pending-changes,/data_sources/active,/data_sources/{id}/full_schema) so the connection returns to the pool before serialization — mirroring the proven SSE early-release pattern. - Connectors without agents (#467) — tool providers (e.g. Notion) are now usable standalone without wrapping them in a full analytical agent, including Notion dynamic client registration (DCR) OAuth and connector-aware UI in the Knowledge Explorer (
connector_key,is_connector, a "Connector" badge). Localized across all 10 locales. - Quota policies — monthly spend cap in USD (#488) — usage policies can now cap monthly LLM dollar spend (
monthly_spend_limit_usd) in addition to tokens, queries, and data volume. Spend is tracked in micro-USD on a newllm_cost_micro_usdusage counter, computed per LLM call from the same per-model token rates the Cost console uses, and buffered on the per-agentUsageLimitContextthen flushed at end-of-run (mirroring the token path). The pre-call quota check now also stops a user once their buffered+recorded spend reaches the cap (a 429 with metricllm_cost_micro_usd). The Create/Edit Quota modal gains a Monthly spend limit (USD) field and a per-policy Spend badge; the whoami usage-quota summary exposes aspendmetric in USD. Localized (en/he/es). - Localize the monitoring Cost tab + RTL (#492) — the
/monitoringCost tab usedmonitoring.cost.*keys that existed only inen.json, so every other locale silently fell back to English. Adds the fullmonitoring.costblock (33 keys) plus thetabCostlabel to all 9 non-English locales, localizes the echarts trend tooltip/series name, and makes the metric toggle RTL-ready (physicalborder-l→ logicalborder-s,space-x-2→gap-2). - Fix —
[object Object]in Custom API headers/endpoints (#491) — in the Custom API "Edit connection" form, the Custom Headers (dict) and Endpoints (list,ui:type: "json") fields fell through to a plain-text input bound to an object/array and rendered as[object Object]. Tagsheaderswithui:type: "keyvalue"to use the key/value row editor, and adds ajsonfield type toConnectForm.vue(monospace textarea with parse/serialize sync, inline "Invalid JSON" error, and a proper array/object default).