Releases: lablup/backend.ai-go-releases
v1.8.0-beta.1
Hermes autonomous agents platform end-to-end onboarding (wizard, gateway, channels, skills, plugins/MCP browser, permissions), MCP wired into agent runtime, MLX recommendation on Apple Silicon.
Backend.AI GO v1.8.0-beta.1
23 commits since v1.7.2. (38,694 lines added, 1,388 lines deleted)
New Features
- Hermes module skeleton —
HermesConfig(camelCase JSON, YAML on disk),HermesProfile/HermesProfileRef,HermesMcpServer/HermesMcpScope,HermesPluginRef,HermesTerminalBackend,HermesPlatformBinding,HermesLlmConfig, and a profile manager that round-trips upstream~/.config/hermes/*.yamlbyte-identically. Per-platform credentials live behindcredentialsRefon the wire (raw secrets never serialize) and the sameMessagingPlatformenum is reused fromcrate::autonomous::types. Fulldto_validation.rs+ canonical-example round-trip test (, epic Phase 2 /). - Hermes environment detection and container installer — detects the user's container runtime (Docker / Podman / Apple Container) and reports actionable
EnvironmentIssuevariants (container_runtime_not_found,container_runtime_unsupported,image_missing,image_outdated,port_in_use,persistent_volume_unavailable,custom). Installer drives pull progress withInstallStage/InstallProgressevents through theautonomous_*SSE bus . - Hermes gateway lifecycle + daemon WS/HTTP client + event bridge — start / stop / health-check the Hermes gateway container, stream daemon events into the
autonomous_*SSE channel, and proxy HTTP calls (channels, skills, models, send-message) through a thin Rust client so the React layer talks to one provider-agnostic shape . - continuum-router wired as the Hermes LLM provider (PHASE2-4) — the Hermes daemon's LLM bridge now points at Backend.AI GO's local router instead of an external Anthropic endpoint by default, so locally served models can drive Hermes agents without an internet round-trip; the bridge respects
model_aliasesand Web Search injection from the Claude Code router config . - Hermes setup wizard UI with
hermes claw migrateintegration — end-to-end onboarding: container runtime check, image pull withInstallProgressUI, profile creation, channel selection, LLM bridge sync, optional one-click migration of existing Claw profiles via the newhermes claw migrateCLI subcommand. Picks up where the existing Autonomous Agents shell leaves off so Hermes can be onboarded in-app without touching the command line . - Hermes plugins / MCP browser — discover MCP servers (
HermesMcpServer) and plugin references (HermesPluginRef) registered in the daemon, enable / disable per-scope (profile/user/system), and inspect tool surfaces before binding them to a profile . - Hermes permissions + container settings + approval workflow — profile-level permission grants (filesystem mounts, network egress, tool allowlists), container resource limits, and a per-action approval queue that pipes into the existing supervisor
ApprovalDialogso Hermes agent actions share the same audit machinery as in-app agents . - Hermes Channels tab with per-platform credential entry — bind a Hermes profile to one or more
MessagingPlatformchannels (Telegram, Slack, Discord, WhatsApp, Home Assistant, Google Chat, etc.) and store credentials behindcredentialsRefin the OS credential vault; only the reference ID ever lands inhermes.yaml. - Hermes Skills tab and reusable skill components — lists discovered skills (
AgentSkill,SkillSource) per profile with a refactored, provider-agnostic skill card surface shared with the existing autonomous-agents UI . - Recommend MLX-format models in Featured Models on Apple Silicon — reorders the curated list so MLX builds float to the top when the platform detects an Apple Silicon Mac, matching the engine the user is most likely to run .
Improvements
- Provider-agnostic channel/messaging UI with tab registry — hoists the channel and messaging surfaces out of the legacy Claw layout into a registry-driven tab system so any
AutonomousAgentProvider(Claw, Hermes, future backends) can contribute tabs without forking the page. Existing Claw routes continue to render through the same registry . - Split tests out of pre-push gates and parallelize frontend / Rust lanes so
make checkfinishes faster on contributor machines while CI still runs the full suite. What's Newslash command updated to better drive per-release locale catalog refreshes.cargo fmtapplied to the Claw provider module so the recent adapter rewrite matches surrounding style.
Bug Fixes
- MCP tool names containing colons (e.g.
server:tool) were rejected by the Anthropic API path because Claude's tool-name validation forbids:. The MCP bridge now sanitizes tool names toserver__toolon the wire so agents using Claude models can call MCP tools registered with namespaced names without manual renaming . - MCP tools wired into the agent runtime — the MCP registry was loaded but its tools were not surfaced to the runtime tool dispatcher; agents could see MCP servers in settings but could not actually call their tools. Now MCP tools are merged into the agent's tool catalog on session start and execute through the same tool-execution pipeline as built-in tools .
- Ensure
dist/exists before theembed-frontendRustEmbed derive runs — cleancargo build(no priorpnpm build) was failing because RustEmbed requires the target directory to exist at macro-expansion time . - Register Hermes routes in the
route_scopemanifest soroute_scope_middlewareenforces the same scope gate as the rest of the management API surface; without the manifest entries, the fallback pass-through would let any authenticated identity hit Hermes endpoints regardless of scope . - Raise the FD soft limit at the start of
make test-rustso the full Rust test suite no longer hits "Too many open files" on macOS defaults . - Remove a duplicated
cfg(test)attribute inhermes::mcp_teststhat preventedcargo build --testsfrom compiling onmainafter merged. - Silence Windows-only unused-import and dead-code warnings in
cli.rssocargo clippyis clean on cross-platform builds.
CI/CD Improvements
- Temporarily disable the Windows build job in the packaging workflow while a sidecar binary-bundling regression is investigated; non-Windows artifacts continue to build. Will be re-enabled before v1.8.0 stable.
- Local pre-push gates split tests off the critical path and run frontend / Rust lanes in parallel.
Technical Details
- Hermes module structure: types and config under
src-tauri/src/hermes/, withdto_validation.rspinning the wire shape (camelCase JSON, snake_case YAML) and a canonical-example test asserting byte-identical save-load-save round-trip with upstream~/.config/hermes/*.yaml. - Reuse:
MessagingPlatformenum is shared fromcrate::autonomous::typesrather than redeclared inhermes; theAutonomousAgentProvidertrait abstraction (epic Phase 1) is what makes the provider-agnostic tab registry possible. - Secret handling: per-platform credentials never serialize to disk —
HermesPlatformBindingonly carriescredentialsRefon the wire, and the raw API key only lives in the OS credential vault; same pattern applied toHermesLlmConfig.apiKeyEnv. - Continuum-router integration: PHASE2-4 of makes the Hermes daemon point its LLM bridge at the local router; honors
model_aliasesand Web Search injection fromRouterConfigYamlso Claude Code router config and Hermes config share one source of truth. - MCP tool-name sanitization:
server:tool→server__toolmapping is one-way on the outbound side and reversed on the inbound side so the agent sees the original name in tool-use responses; round-trip tests pin the mapping.
Dependencies
- No notable production dependency bumps in this beta.
- Workspace bumped to
backend-ai-go v1.8.0-beta.1(cargo update -p backend-ai-go).
Breaking Changes
None. The provider-agnostic tab registry preserves the existing Claw routes through the same registry, and the legacy clawStore continues to operate as a backward-compatibility shim for existing callers.
Known Issues
- Windows packaging job is temporarily disabled while a sidecar binary-bundling regression is investigated; Windows installers (NSIS) are not produced for this beta and will return before the v1.8.0 stable release.
Full Changelog
v1.7.2
v1.7.2 introduces the Autonomous Agents platform foundation (provider trait + registry + adapter), Claude Code router integration with verify probe, API-driven capability detection for remote provider models, and the OpenAI ChatGPT Codex OAuth provider.
Backend.AI GO v1.7.2
49 commits since v1.7.1. (49,781 lines added, 3,057 lines deleted)
New Features
Autonomous Agents Platform Foundation
- New
AutonomousAgentProvidertrait, supporting types (ProviderKind,ProviderCapabilities,MessagingPlatform,GatewayStatus,EnvironmentReport,InstallProgress,AgentChannel,AgentSkill,ModelSummary,SyncedModel,ProviderEvent, etc.) andProviderRegistryso multiple autonomous-agent backends can plug in side by side. DTO validation tests pin the wire shape across all enums and tagged unions (, epic,). - Unified Tauri IPC + REST API surface under the
autonomous_*namespace. Both transports call into the same shared registry so command parity, scope enforcement, and SSE event mirroring are guaranteed by construction . autonomousAgentsStoreZustand store with selector hooks; the legacyclawStorecontinues to operate as a backward-compatibility shim so existing callers do not break during the migration .AutonomousAgentsPageshell with sidebar navigation rename ("Autonomous Agents" replacing the legacy "Claw" entry); the deprecated/clawroute is removed and deep links redirect to the new page .
Claude Code Router Integration (epic)
- Settings → Claude Code tab points Anthropic's Claude Code CLI at your local Backend.AI GO router. Four cards (Endpoint / Quick Setup / Model Aliases / Web Search) backed by the new
model_aliasesandweb_searchsections ofRouterConfigYaml, with a card-level Save bar gated on validation and a?tab=claude-codedeep link . ClaudeCodeEndpointCardwith read-onlyANTHROPIC_BASE_URL, maskedANTHROPIC_API_KEY,ANTHROPIC_MODELselector, "Copy as export" / "Copy as .env" buttons, and a "Verify" button issuing a/v1/messagesprobe throughrouter::service::verify_anthropic_endpoint(shared by Tauri command and REST handler) with classified outcomes:connection_refused,timeout,auth,model_not_found,schema_mismatch,other.- Locale fan-out across all six locales (28 keys under
settings.apiSettings.claudeCode.*) withlocale-parity.test.tsenforcing structural parity. User-facing docs atdocs/en/api-server/claude-code.mdanddocs/ko/api-server/claude-code.mdcovering env vars, WebSearch provider table, walkthrough, troubleshooting, and known limitations . - Interim UX notice that web search API keys entered in the Claude Code → Web Search card are stored separately from the Providers panel .
API-Driven Capability Detection
- Two-tier capability schema (provider-level + per-model) replaces the pure name-string heuristic with a five-level pipeline:
ManualOverride > ProviderTable > ExtendedMetadata > EndpointInheritance > NameHeuristic. Backendsrc-tauri/src/providers/capabilities/with prober, metadata parser, detector, hardcoded provider tables for OpenAI / Anthropic / Gemini, and SQLite-backed cache with 7-day TTL plus manual-override survival. Eight service functions exposed as both Tauri commands AND REST handlers per the API parity rule. RemoteModelsTab and ModelsPage kick offrefreshAllProviderCapabilities(true)non-blockingly with row-by-row event streaming . CapabilityOverrideDialogwith Inputs / Outputs / Features tabs, per-row Re-detect / Override actions inRemoteModelCard, and chip tooltips showing localizeddetected_viapipeline chain and confidence level .- Auto-download of
model-metadata.yamlwithcontinuum-routerso version bumps no longer leave stale model definitions; bundled metadata synced to v1.6.1 .
Other Additions
- OpenAI ChatGPT (Codex OAuth) provider with device-code login. Per-provider token store at
<app_data_dir>/router/auth/<id>.jsonso the continuum-router consumes it without surfacing the access token to the frontend . - Agent Profile "From URL" import accepting
https://links to.jsonprofile files with SSRF protection (private/loopback range blocking via custom DNS resolver), 256 KiB body cap, 10 s timeout, 3-redirect limit, and embedded-credential rejection . - Carry
recommendedSamplingdefaults and the user's per-model sampling config through.baimodelpackages so re-imports keep their preferred sampling parameters end-to-end (issue,). repairMarkdownTablesutility insrc/lib/markdownTableRepair.tsintegrated intoMarkdownContentrendering. Pure preprocessor that repairs three malformed GFM table patterns produced by local LLMs (delimiter-row pollution, empty delimiter cells, list-marker contamination) before they reachreact-markdown.- Additive
translationsmap onRegistryProfileEntrywith optionalname/descriptionoverlays, backward-compatible .
Improvements
agent_profilestore::getandstore::deleteuseread_profile_fileas the sole existence probe, mappingIoError(NotFound)toAgentProfileError::NotFound(id)so REST callers see consistent 404s .- Unified Serper / Brave Search API key storage between Settings and Claude Code. Web Search card persists
${BACKEND_AI_SERPER_API_KEY}/${BACKEND_AI_BRAVE_API_KEY}placeholders instead of plaintext keys; Backend.AI GO injects matching env vars into every router child spawn . - Wrap the legacy Claw module as an
AutonomousAgentProvideradapter so the existing OpenClaw integration runs through the new provider trait without breaking running deployments . - API Settings page migrated to the shared
SettingsLayoutsidebar pattern introduced in v1.7.1 . - Unify ApiSettings and Settings sections under a single layout primitive and fix a TCP fallback gap in the Claude Code endpoint card .
- Unify ad-hoc page tab implementations on the common
Tabscomponent so every page shares the same accessibility behaviour, keyboard navigation, and visual treatment (issue,). - Extend
RouterEndpointResolverto translation, stats, agent, and lifecycle endpoints so headless REST mode uses the Unix-socket fast-path consistently across every router-backed surface . - Migrate every consumer of
isImageGenerationModel,getImageEditCapabilities,getImageModelType,supportsVision,getModelImageParamCapabilities, andsupportsImageRefinementto forward the providers'ModelCapabilityRecord, with deterministic provider-id ordering for stable cross-session winners . - i18n parity for capability detection across
ja,zh-CN,zh-TW, andes— 27 missing keys mirrored from canonical en/ko locales .
Bug Fixes
reset_settings(Tauri + REST) returns the resolved platform default forgeneral.modelsDirectoryinstead of an empty string. Six locale files (en, ko, ja, zh-CN, zh-TW, es) drop the hardcoded legacy path. New REST endpointGET /api/v1/settings/default-models-directoryreturns the platform default for headless clients .- Prevent a duplicate pool session when the user selects a model that is already loaded .
- Harden several recent model and router follow-ups discovered during pre-release smoke testing.
- Register
agent_profile_import_from_urlin the parity and security-regression scope manifests so the new From-URL transport pair is enforced by the boundary tests . - Community tab agent cards now use translations and preserve raw categories .
- Summarization prompt no longer injects the Qwen3-specific
/no_thinkcontrol token into prompts sent to other model families . - Walk providers in lexicographic order in
useCapabilityRecordByModelIdandgetCapabilityRecordByModelIdso the winner for amodelIdcollision is stable across sessions (HIGH severity, review of). - Restrict
<article>keyDownhandler inRemoteModelCardto its own target so Enter/Space on Re-detect / Override buttons no longer cross-firesonToggle. Track the redetect spinner timer withuseRef+useEffectcleanup. Replace destructureduseProvidersStoreinCapabilityOverrideDialogwith stable per-action selectors . - Capability detection routes added to
ROUTE_MANIFESTinmanagement_api/route_scope.rssoroute_scope_middlewareenforces the same scope gate asPUT /providers/{id}(HIGH severity,). - Capability probe HTTP client redirect cap reduced from reqwest's default 10 hops to 1 hop to prevent latency amplification .
- Preserve seeded provider endpoint flags on indeterminate probe outcomes; use
HashSetmembership when pruning orphan capability rows; add eight Tauri/REST mappings to API parity manifest . - Delete action hidden for built-in agent profiles in
AgentProfileCard;store::createstripsis_builtin = false. cargo test --test api_parityfailure onmainfrom missing five transport pairs inPARITY_MAPPINGS(four Codex OAuth commands + verify-probe pair) — added .cargo test --test security_regressionfailure from same omission — four codex-oauth REST routes added toROUTE_MANIFESTwithsettings_writescope ( follow-up).router::service::tests::backends_are_preserved_across_savesno longer fails to compile after continuum-router v1.6.2 introducedBackendConfig::auth: Option<BackendAuthConfig>.
CI/CD Improvements
- Local pre-push quality gates via lefthook (auto-installed by the
pnpm installpreparescript) so contributors runmake checkbefore every push; an explicitSKIP_LOCAL_GATES=1escape hatch keeps emergency bypasses auditable . - Release statistics tracking script for measuring change scope across releases.
Technical Details
name_heuristic::detectregex caching:dall-?e[-_]?3andnano[-_]?banana[-_]?proregexes cached in theOnceLockNameHeuristicstruct alongside the rest of the heuristics so the per-call compile is no longer a hot path (HIGH severity,).router::servicemodule as the single source of truth for `router_conf...
v1.7.2-beta.2
Claude Code router-settings tab lands with the model_aliases + web_search RouterConfigYaml extensions, a /v1/messages Verify probe, OpenAI Codex OAuth device-code login, and agent-profile defense-in-depth hardening.
Backend.AI GO v1.7.2-beta.2
14 commits since v1.7.2-beta.1. (13210 lines added, 397 lines deleted)
New Features
- Claude Code router-settings tab in Settings → API. Four cards (Endpoint, Quick Setup, Model Aliases, Web Search) compose the new tab between Providers and Mesh. The tab is fully wired through
RouterConfigYamlextensions so continuum-router can rewrite hard-codedclaude-haiku-4-5-20251001/claude-sonnet-4-6/claude-opus-4-7model names to locally served models and (optionally) inject Serper / Brave / Exa search results into agent prompts (,,, epic). RouterConfigYamlextended withmodel_aliases(ModelAliasesConfig) andweb_search(WebSearchConfig) fields, both optional andskip_serializing_if = "Option::is_none"so existing configs round-trip unchanged.ModelAliasesConfigmaps size-class slots (haiku,sonnet,opus,reasoning,default) plus anexactHashMap.WebSearchConfigmirrors the continuum-routerweb_searchschema (provider, api_key, timeout, result caps, inject policy) and includes a customDebugimpl that redactsapi_key. DTO-validation tests pin the wire shape against the router spec .routerSettingsStoreextended with TypeScript mirrors of the Claude Code router fields. Four new Zustand actions —setModelAlias,setExactAliasEntry,updateWebSearch,applyClaudeCodeDefaults— manage the optionalmodel_aliasesandweb_searchsub-trees with tombstone semantics (drops the parent key when the last field is cleared). Two selector hooks:useModelAliases,useWebSearch.ActiveTabunion extended with"claude-code".ClaudeCodeEndpointCardships with read-onlyANTHROPIC_BASE_URL(derived frombind_addressviaderiveAnthropicBaseUrl),ANTHROPIC_API_KEY(password input with reveal toggle), andANTHROPIC_MODEL(Select populated from loaded models andmodel_aliases.default). "Copy as export" and "Copy as .env" buttons land the three env-vars as shell-ready snippets. A Verify button issues a/v1/messagesprobe through the canonical API adapter;router::service::verify_anthropic_endpoint(shared by both Tauri command and REST handler) classifies outcomes intoconnection_refused,timeout,auth,model_not_found,schema_mismatch, orotherso the UI renders a localized hint .- OpenAI ChatGPT (Codex OAuth) provider with device-code login flow.
CodexOAuthLoginDialogruns the device-code dance;codexOAuthServiceis the transport-agnostic shim forstart/poll/cancel/revoke. Per-provider token store is written to<app_data_dir>/router/auth/<id>.json. Full Tauri + REST parity on the four Codex OAuth commands . - Locale fan-out for the Claude Code Settings tab across
en,ko,ja,zh-CN,zh-TW,es— 28 keys undersettings.apiSettings.claudeCode.*cover Endpoint, Quick Setup, Model Aliases, and Web Search cards plus inline help text and error messages. Alocale-parity.test.ts(16 cases) enforces structural parity. User docs shipped atdocs/en/api-server/claude-code.mdanddocs/ko/api-server/claude-code.md. - Interim notice that web search API keys entered in the Claude Code → Web Search card are stored separately from those in the Providers panel. Rendered below the
api_keyinput inWebSearchCard.tsxwithclaude-code-section__hintstyling and a corresponding!!! note "Storage separation"admonition in both English and Korean docs. Both surfaces cross-reference (the planned consolidation fix) .
Improvements
router::servicemodule is the single source of truth forrouter_config.yamlread/write logic.read_router_config_from_file,save_router_config_preserving_backends, andreset_router_config_to_defaultare called by both the Tauri command and the REST handler so validation, backend-list preservation, and 0o600 permission enforcement live in exactly one place.ServiceErrordiscriminatesValidationfromIo/Serdeso the REST handler maps validation failures to 400 without duplicating that decision in the transport layer .- Quick Setup card writes haiku/sonnet/opus/default slots in a single fan-out and immediately persists. Model Aliases card surfaces per-slot
<Select>rows for primary aliases plus an advanced reveal forreasoningandexactmappings using theCorsOriginsEditorvisual pattern. Web Search card exposes provider dropdown, maskedapi_keywith explicit reveal toggle, and eight advanced tuning fields. A card-level Save bar withHotReloadBadgeconfirmation sits below the cards; Save is gated ongetWebSearchValidationKeyso web_search enabled without an api_key blocks persistence . - All interactive elements in the new Claude Code tab use
src/components/common/primitives (no raw<button>,<select>, or<input type="checkbox">); two pure helpers inutils.ts—getWebSearchValidationKeyandbuildClaudeCodeModelOptions— are the single source of truth for the blocking rule and option construction; both are unit-tested. 10 component tests, 2 regression tests inApiSettingsPage.test.tsx, and 10 new util tests .
Bug Fixes
cargo test --test api_paritywas failing onmainbecause five transport pairs were missing fromPARITY_MAPPINGS: the four Codex OAuth commands/endpoints (start_codex_oauth_login,poll_codex_oauth_login,cancel_codex_oauth_login,revoke_codex_oauth_tokens) and the verify-probe pair (verify_anthropic_endpoint/POST /router/verify-anthropic-endpoint). Both transports already existed and shared their service function; only the parity manifest was missing the rows .cargo test --test security_regressionwas also failing onmainfrom the same omission. The four codex-oauth REST routes were absent fromROUTE_MANIFESTinmanagement_api/route_scope.rs— added withsettings_writescope (mirrors the surrounding/providers/*mutation routes).oauth.rsadded toHANDLER_FILES_WITHOUT_EXPLICIT_SCOPE_ALLOWLIST(, follow-up).router::service::tests::backends_are_preserved_across_savesno longer fails to compile after the continuum-router v1.6.2 bump introducedBackendConfig::auth: Option<BackendAuthConfig>; the test fixture now setsauth: Nonelike every other field ( drive-by).- Delete action hidden for built-in agent profiles in
AgentProfileCard(marketplace grid), matching the existing gate inAgentProfileEditor.store::createnow unconditionally stripsis_builtin = falseso a caller cannot promote a newly created profile to built-in status . store::updatepreservesis_builtinfrom disk, preventing a REST/Tauri caller from unmarking a canonical built-in profile and bypassing the delete-protection guard. Forcingfalseinupdatewould allowPUT {canonical-builtin-id}withis_builtin: falsefollowed by a successfulDELETEbecause theBuiltinCannotBeDeletedguard is a conjunction ofprofile.is_builtin && is_canonical_builtin_id(id).
CI/CD Improvements
None.
Technical Details
- Single source of truth between Tauri commands and REST endpoints for all new transports:
router::service::verify_anthropic_endpoint,router::service::{read_router_config_from_file, save_router_config_preserving_backends, reset_router_config_to_default}, and the fourproviders::oauth::codex::*service functions. Both transports are thin wrappers per.claude/rules/api-parity.md. ?tab=claude-codedeep-link works via thevalidTabsallowlist already extended in.
Dependencies
- Update
continuum-routerto v1.6.2 (picks upBackendConfig::auth: Option<BackendAuthConfig>).
Breaking Changes
None.
Known Issues
- Web search API keys entered in Claude Code → Web Search are stored separately from those in the Providers panel; consolidation is tracked in.
Security
agent_profilestore::updatedefense-in-depth hardening (three changes, defaulting to Option A from the issue): (1)Self::validate_id(id)?is now the first statement ofupdate, mirroringgetanddeleteand rejecting path-traversal / null-byte / overlong IDs before any disk access; (2) the redundant upfrontpath.existscheck is removed in favour of usingread_profile_fileas both the existence probe and the source-of-truth read foris_builtin(any I/ONotFoundis mapped toAgentProfileError::NotFound(id)); (3) a newAgentProfileError::BuiltinCannotBeModifiedvariant blocks content mutation on canonical built-in templates (UUID v5 IDs fromtemplates::get_builtin_templates). Without this guard a direct REST/Tauri caller could rewrite "Code Assistant"'ssystem_prompt(prompt-injection vector), elevateenabled_tools, or swappreferred_model_id. The new error maps to HTTP 400 inmanagement_api/handlers/agent_profiles.rs, matching the existingBuiltinCannotBeDeletedmapping .- Four SSRF defenses on the verify endpoint: scheme allowlist (
http/httpsonly), cloud-metadata host block (169.254.169.254/ GCP / Azure / Alibaba + full169.254.0.0/16link-local range), 64 KiB response body cap, andapi_keyscrub on allerror_detailsurfaces — REST callers supplying a cloud-metadata URL receive a 400 . - Claude Code settings hardening — `` reviews and locks down the new Claude Code tab surfaces (defense-in-depth on the
api_keyhandling and validation paths added in /).
Full Changelog
v1.7.2-beta.1
API-driven capability detection for remote provider models — five-level pipeline with SQLite cache and live row-by-row UI updates, plus override dialog, markdown table repair, and Community card translations.
Backend.AI GO v1.7.2-beta.1
12 commits since v1.7.1. (11971 lines added, 343 lines deleted)
New Features
- API-driven capability detection for remote provider models . Two-tier capability schema (provider-level + per-model) replaces the pure name-string heuristic with a five-level pipeline:
ManualOverride > ProviderTable > ExtendedMetadata > EndpointInheritance > NameHeuristic. Backend (src-tauri/src/providers/capabilities/) ships with types, prober, metadata parser, detector, name-heuristic Rust port, hardcoded provider tables for OpenAI / Anthropic / Gemini, and a SQLite-backed cache with 7-day TTL plus manual-override survival. Eight service functions exposed as both Tauri commands AND REST handlers; both transports call the same internalproviders::capabilities::*function per.claude/rules/api-parity.md. End-to-end event streaming (provider:capabilities-started,provider:capabilities-progress,provider:capabilities-updated,provider:capabilities-failed) wired throughuseProviderListenersso per-model rows upgrade row-by-row as detection completes. Concurrency cap 8, per-model timeout 2 s, redirect cap 1, partial-failure tolerated. - Capability override UI . New
CapabilityOverrideDialogcommon component with Inputs / Outputs / Features tabs rendered asToggleSwitchrows seeded from the currentModelCapabilityRecord. "Save" callsprovidersStore.setCapabilityOverride; "Reset to detected" callsclearCapabilityOverride; both show inline error feedback on rejection. Per-row "Re-detect" and "Override" action buttons inRemoteModelCardsurface in an on-hover toolbar.ModelCapabilityChipsbadge tooltips now show the localizeddetected_viapipeline chain and confidence level. - Auto-download of
model-metadata.yamlwith continuum-router . The router needs a version-matched metadata file at runtime, but it lives in thelablup/continuum-routerrepo (not as a release asset) and was previously hand-committed.scripts/download-continuum-router.shnow fetchesmodel-metadata.yamlfrom the matching tag viagh api -H "Accept: application/vnd.github.v3.raw", once per invocation regardless of how many platforms are requested; empty and JSON-error responses are detected before the file is moved into place. The bundledmodel-metadata.yamlis synced to v1.6.1, picking upgpt-image-2, the retrieval/embedding capability split, and other entries the bundled copy was missing. - Markdown table repair preprocessor . New
repairMarkdownTablesutility insrc/lib/markdownTableRepair.tsand integration intoMarkdownContentrendering. Repairs three malformed GFM table patterns produced by local LLMs before they reachreact-markdown: delimiter-row pollution (e.g.,| :---ed |→| :--- |), empty delimiter cells filled with---, and list-marker contamination (e.g.,* | body |→| body |). Idempotent on valid input, code-fence-aware (backtick fences preserved), streaming-safe (incomplete table windows untouched), with a no-pipe early-exit fast path. 34 fixture-anchored unit tests plus four integration tests rendering the real<ReactMarkdown>tree. - Additive
translationsmap onRegistryProfileEntry. With a slimRegistryProfileTranslationcarrying optionalname/descriptionoverlays,#[serde(default, skip_serializing_if = "HashMap::is_empty")]so older registry indices and cache files keep parsing unchanged. Documented indocs/en/cowork/profiles.mdanddocs/ko/cowork/profiles.md. - Release statistics tracking script for measuring change scope across releases.
Improvements
- All capability consumers migrated to prefer
ModelCapabilityRecord. Every consumer ofisImageGenerationModel,getImageEditCapabilities,getImageModelType,supportsVision,getModelImageParamCapabilities, andsupportsImageRefinementnow forwards the providers'ModelCapabilityRecordso the API-driven detection wins over the legacy name heuristic when present, and falls back to the heuristic when no record exists yet. New helpers:useCapabilityRecordByModelId(React) andgetCapabilityRecordByModelId(snapshot); both walk providers in lexicographic order so the winner for amodelIdcollision is stable across sessions.makeRecordFinderextracted fromprovidersStoreso the five inlinefindRecordcopies share the same deterministic-order logic. Migrated 18 files across components, hooks, stores, lib, and pages. - Capability detection i18n parity across
ja,zh-CN,zh-TW, andes. 27 missing keys undermodels.capabilities.*(top-level labels,detection.*,actions.*,dialog.*) mirrored from the canonical en/ko locales. Chinese variants aligned with surrounding term conventions: zh-CNproviderTable(提供方表 → 供应商表) and zh-TWproviderTable(提供者表 → 供應商表) match the existingmodels.*keys; zh-TWimageVariation(圖像變化 → 圖像變體) matches the existing image-variation cluster.
Bug Fixes
- Community tab agent cards now use translations and preserve raw categories .
CommunityProfileCardresolvesdisplayName/displayDescriptionthroughgetTranslatedName/getTranslatedDescription, matchingAgentProfileCard. The category badge no longer collapses every unknown category to "Custom" — known enum values still translate via the locale catalog, free-form community categories ("general", "writing-tools", ...) are humanised to Title Case, and empty categories render no badge. 18 unit tests coverhumanizeCategorybehavior. - Summarization prompt no longer injects the Qwen3-specific
/no_thinkcontrol token . The literal/no_think\nprefix inSUMMARIZE_INSTRUCTIONSis a Qwen3-only control token; other model families (Llama, Mistral, Gemma, Phi, GPT, Claude, Gemini) interpret it as literal user input, corrupting the summarization prompt and occasionally leaking the token into generated summaries. Sibling fix to which patched the same issue in title generation. Regression test asserts no message in the LLM payload contains/no_thinkfor any model id. - Stable provider winner for
modelIdcollisions (, HIGH from review of).useCapabilityRecordByModelIdandgetCapabilityRecordByModelIdwalk providers in lexicographic order so the winner for amodelIdcollision is stable across sessions. Without sorting, the winner depended onMapinsertion order driven by network completion order, and a different provider could win each time. - Cross-firing button events fixed in
RemoteModelCard.<article>keyDownhandler is now restricted to its own target so Enter/Space on the row's Re-detect / Override buttons no longer cross-firesonToggle. Redetect spinner timer tracked withuseRef+useEffectcleanup so it is cancelled when the card unmounts. DestructureduseProvidersStoreinCapabilityOverrideDialogreplaced with stable per-action selectors so background capability-detection events do not re-render the dialog on every store mutation. - Capability detection routes added to
ROUTE_MANIFEST(, HIGH security).route_scope_middlewarenow enforces the same scope gate asPUT /providers/{id}and friends — without the manifest entries, the fallback "pass-through" let any authenticated identity call them regardless of scope. - Name-heuristic regexes cached in
OnceLock(, HIGH perf).name_heuristic::detectpreviously rebuilt thedall-?e[-_]?3andnano[-_]?banana[-_]?proregexes on every call; with ~50 models per provider per refresh, the per-call compile became a measurable hot path. Both are now cached alongside the rest of the heuristics. - Capability probe HTTP redirect cap reduced from 10 to 1 . For endpoint reachability discovery we never need to follow more than one redirect; treating the redirect target as the answer prevents a malicious provider URL from chaining redirects to amplify probe latency up to the per-request 2 s timeout.
- Provider capability cache hardening (post-merge follow-up to /). Preserves seeded provider endpoint flags on indeterminate probe outcomes so transient timeout/5xx responses do not erase known-good cache state. Uses
HashSetmembership when pruning orphan capability rows to avoid quadratic scans on large provider model lists. The eight provider capability Tauri/REST mappings added to the API parity manifest;cli.rsadded to the security handler-scope baseline with a route-scope-middleware note.
CI/CD Improvements
- None
Technical Details
- Hot path optimization: deterministic provider ordering for capability lookups, cached regex compilation, per-call HashSet membership for orphan-row pruning.
- Event lifecycle:
service::detect_provider_with_models_emittingextends to take an optional runtime-agnosticArc<dyn EventEmitter>and emits events at four points:startedat the very beginning,capabilities-updatedfor the provider record after server-endpoint detection,capabilities-updatedagain for each model as itsJoinSettask completes (replacing the prior monolithicfor handle in handlesjoin loop), andprogressafter every model. - Lifecycle parity:
providers/lifecycle.rsextractstrigger_initial_capability_detection(background spawn),invalidate_capabilities_for_change(manual overrides preserved), andcascade_capability_deleteso both Tauri and REST paths share the same code rather than duplicating cache lifecycle handling. - Test coverage: 42 unit tests + DTO validation tests for capabilities, 19 component tests for
CapabilityOverrideDialog, 13 store tests forprovidersStoreevent handlers, 7 tests foruseProviderListenerslifecycle, 16 contract tests forproviderCapabilityService, 34 fixture-anchored markdown table repair tests + 4 integration tests, 18 tests for `CommunityProfileC...
v1.7.1
Settings page redesigned to a left-sidebar layout grouped into App / Agent / System; Squad Channels gets a card grid plus drawer settings panel; global corner-triangle card accent rolls out; CLI install and QR code v1.7.0 regressions fixed.
Backend.AI GO v1.7.1
12 commits since v1.7.0. (10089 lines added, 5510 lines deleted)
New Features
- New
SettingsLayoutcommon component (src/components/common/SettingsLayout/) — vertical sidebar nav with grouping, tag badges, roving-tabindex keyboard navigation (Up/Down/Home/End/Enter/Space), WCAGaria-orientation="vertical"ARIA tab pattern, and a mobile drawer fallback below 768 px . - New
PageLayoutvariant="full"option that removes the max-width clamp, letting pages with their own internal layout chrome (such as the sidebar-based Settings page) span the full viewport width . - New
ChannelCardandChannelSettingsDrawercomponents for the Squad Channels tab, both wrapping common primitives (BaseCardandDrawer) and sharing tokens / accessibility behavior with the rest of the app .
Improvements
- Settings page redesign — horizontal top tabs replaced with a vertical left-sidebar layout matching Ubuntu / Windows 11 / macOS Settings, grouped into App / Agent / System ; single-card chrome with sticky sidebar, mirrored sidebar width via
--token-sidebarWidth, filled active-state tint (no layout shift on activation), label ellipsis, and 10 new nav icons (Appearance, Generation, Tools, Advanced, Memory, Supervisor, Policy, AgentProtocol, Connectors, Nodes) ; every Settings tab migrated to the sharedSectionGroup(h3) primitive — ModelsSettings, ToolSettings, McpSettings, AcpSettings, AcpPermissions, DemoSettings, MemorySettings, SupervisorSettings, PoliciesSettings (main + editor drawer), NodeSharingSettings, ConnectedNodesSettings — for unified heading hierarchy with inline action buttons moved into the SectionGroupactionslot ; Settings General tab split into focused sub-tabs . - Squad Channels card grid — the per-channel
Accordionis replaced with a responsiveChannelCardgrid (1/2/3 columns at mobile/tablet/desktop) and aChannelSettingsDrawerthat hosts the existing per-channel*Settingsform (Telegram / Slack / Discord / WhatsApp / OpenClaw), mirroring the AgentMarketplace pattern. Drawer body CSS flattens the legacy outer borders/padding so embedded forms sit cleanly inside the drawer instead of under accordion chrome. Drawer dirty-state confirms via the commonConfirmDialog; embedded forms unmount after the close animation completes . Channel cards swap the 4 px brand-color left-edge accent strip for a 32 × 32 brand-color triangle clipped viaclip-path: polygon(0 0, 100% 0, 0 100%)pinned to the top-left corner; the triangle grows to 40 × 40 on hover/focus andprefers-reduced-motioncollapses the size transition while preserving the hovered static state . - Global corner-triangle accent rolled out to every card or box that previously used a
border-left: Npx solid <color>emphasis: TaskCard, AgentRowList, ExecutionProgress, PlanApproval, SquadOverviewTab, StepItem, ApprovalDialog (3 sites), CoworkProgressPanel, ToolCallBlock, ToolResultBlock, ChatMessage edit container, ConversationItem and DrawSessionItem active states, DrawConversation refinement, ImportModelDialog (3 blocks), SettingsImportModal, SkillDetailDrawer, GlossaryManager, ImportExportDialog, EngineUpgradeDialog, MemoryViewer (2 blocks), NodeDetailsPanel, and the StructureTab rope-viz note. Each conversion replaces the left border with a 16 × 16::beforeright-triangle clipped viaclip-path: polygon(0 0, 100% 0, 0 100%), positioned at the top-left of the box, withpointer-events: noneandopacity: 0.85. Modifier-based components use a component-scoped custom property (e.g.--task-card-corner-color) so each modifier only swaps the property rather than redeclaring the pseudo-element . - Squad task drawer renders planner-authored Markdown for both the description and result-summary blocks via the existing chat
MarkdownContentrenderer (sanitized via rehype-sanitize, GFM, syntax highlighting, math), with the renderer's outermost margins trimmed so the body sits flush against the section title . - Complete font-size token scale defined and adopted across the codebase .
Bug Fixes
- "Install for current user" / "Install system-wide" buttons in Settings → Advanced → CLI Tools failed with
Command install_cli_symlink not foundbecause the frontend Tauri transport invokedinstall_cli_symlink/uninstall_cli_symlinkwhile the registered Rust commands areinstall_cli_shell_integration/uninstall_cli_shell_integration. The IPC command strings are renamed (TypeScript method namesinstallCliSymlink/uninstallCliSymlinkstay stable). TheuseSystemPathparameter — silently dropped at every layer (component, adapter interface, Tauri/REST adapters, both transports) — is now plumbed end-to-end so the user's system-wide vs user choice actually reaches the backend. REST API parity for the four CLI shell-integration endpoints is added at the same time:GET /api/v1/system/cli/{info,detect}andPOST /api/v1/system/cli/{install,uninstall}, all delegating to the samecrate::cli::servicefunctions withInstallContext::Headlessso daemon-mode REST refuses admin-elevation flows with a clear 400 instead of blocking on a UI prompt . - QR code generation in Settings → Node failing on v1.7.0 with
command generate_qr_code missing required key connectionKey. The TS adapter parameter is renamed toconnectionKey, the unusedsizefield dropped fromApiAdapter.generateQrCode, both adapter delegates, both transports, and theQrCodeDisplayadapter call site. New RESTPOST /api/v1/nodes/qr-codeendpoint added with regression tests . - Squad ChannelSettingsDrawer dirty-state heuristic firing a false-positive Discard prompt on the happy-path close after a successful Connect/Disconnect; the
connectedstate is now in the reset effect deps. Korean unsavedChanges block "취소" collision with the sharedcommon.cancel"취소" — replaced with "버리기" / "버릴까요?" wording mirroring the English Discard intent and the existing ja/es/zh translations . - ChannelSettingsDrawer keeping the embedded
*Settingscomponent mounted in the React tree forever after the drawer's first close — the ref-mutation pattern inherited from AgentProfileEditor never re-rendered the body. Replaced with adisplayChanneluseState so the close-animation timer's clear actually unmounts the embedded form after the 350 ms drawer slide-out . - SettingsLayout per-tab
aria-controlsattributes referenced the currently active panel id rather than each tab's own panel id, contradicting the WAI-ARIA tabs pattern; on mobile both the desktop sidebar (CSS-hidden) and the mobile Drawer rendered the same nav list, producing duplicate DOM ids on the tab buttons. Sidebar is now conditionally rendered only when!isMobile, exactly one nav list is mounted at any time, and each tab'saria-controlsmatches its own panel id .
CI/CD Improvements
None
Technical Details
InstallContextenum introduced so the same CLI shell-integration service can distinguish desktop callers (interactive UI session, allowed to spawnosascript/pkexecadmin prompts) from headless callers (REST handlers in server mode, must refuse those flows). All existing behavior — atomic symlink creation, single-quote escaping for shell injection prevention, Windows registry handling, and the WM_SETTINGCHANGE broadcast — is preserved bit-for-bit .- Regression tests added:
commands::nodes::tests::generate_qr_code_argument_shape_is_camel_casemirrors the argument-resolution struct Tauri synthesizes for the command and verifies that{ connectionKey: "..." }deserializes correctly;commands::nodes::tests::generate_qr_code_rejects_legacy_argument_shapeverifies the previously-broken{ data, size }payload no longer matches;management_api::handlers::nodes::tests::generate_qr_code_request_accepts_camel_caseverifies the REST DTO accepts the same camelCase wire shape;src/lib/api/rest/system.test.tscovers the new REST transport for QR code;src/components/QrCodeDisplay.test.tsxupdated to assert the new single-argument adapter call . - Regression tests added: REST transport tests for CLI install/uninstall endpoints covering
installCliSymlink(true)andinstallCliSymlink(false)asserting the snake_caseuse_system_pathfield in the POST body, anduninstallCliSymlinkasserting no body is sent. Brings the api/ test suite from 94 to 97 tests . - Regression tests added:
ChannelCardandChannelSettingsDrawerunit tests ;SettingsLayoutkeyboard nav, grouping, ARIA, and mobile drawer behavior (27 tests) ;PageLayout.test.tsxcovering standard/wide/full variant classes, className passthrough, and children rendering (5 tests) .
Dependencies
None
Breaking Changes
None
Known Issues
None
What's Changed
- refactor(settings): redesign Settings page from top tabs to left sidebar layout by @inureyes
- refactor(settings): unify layout as single card with sticky sidebar and add nav icons by @inureyes
- refactor(settings): unify all tab sections to use SectionGroup primitive by @inureyes
- fix: QR code generation in Settings/Node fails with missing connectionKey by @inureyes
- fix: CLI install button fails with 'Command install_cli_symlink not found' by @inureyes
- refactor: define complete font-size token scale and adopt across codebase by @inureyes
- refactor(settings): split General tab into focused tabs by @inureyes
- refactor: replace Squad channel accordion with card grid and settings drawer by @inureyes
- refactor(squad): swap channel card accent strip for top-left corner triangle by @inureyes
- refactor: render task descriptions as markdown and adopt corner-triangle accents globally by @inureyes
v1.7.0
Sessions menu, External Connectors (Email + Calendar), multi-agent @mention, governance Phase B, generate_image tool, and 100+ fixes.
Backend.AI GO v1.7.0
171 commits since v1.6.1. (143,498 lines added, 6,356 lines deleted)
New Features
Sessions Management
- Sessions menu rolls out to production with full Active / History / Diagnostics tabs available on every build .
- SessionsService consolidates LLM, diffusion, squad-agent, and history lifecycle events into one observable surface, exposed via Tauri commands and matching REST handlers .
- Active tab with sortable / filterable DataTable, table & card view toggle, and terminate-vs-delete semantics with starting / terminal-state guards .
- History tab with paginated list, delete actions, and persistence so terminated sessions are recorded across restarts .
- Session detail drawer reusing the model-card pattern, plus a Diagnostics tab with PID, health, uptime, and a bounded 200-entry scrollable log list — full API parity (
sessions_get_diagnosticsTauri +GET /api/v1/sessions/{id}/diagnosticsREST);api_keyis never exposed . - Accessible column sorting on the shared
DataTable(per-columnsortable/ accessors / comparators / default direction;aria-sortfor WCAG 2.1 SC 1.3.1; keyboard activation; stable sort) . - Session-alias rename UI when multiple instances of the same model are loaded; multi-session model display in chat & selection surfaces .
External Connectors Platform
- Email (SMTP/IMAP) as the first external connector — IMAP read adapter, SMTP write adapter Stages 0-6, end-to-end docs .
- Calendar (Google Calendar) as the second connector — backend foundation, governance integration, Settings UI alignment with Email .
- Connector governance hook API + thin interceptor .
- Finalized connector audit trail schema with
canonical_serializeandredactedFields, SQLite-backedConnectorAuditStore, redaction pass, and retention policy . - Content-addressed blob storage for rollback snapshots .
- Connector audit log page with one-click undo per row, plus an in-app toast carrying an undo action immediately after a connector write .
- Undo intent taxonomy and orchestration through the connector registry; affordances on notifications, audit rows, and agent cards .
- Channel bot tokens migrated to the OS credential vault; channel capability class declared for governance; channel messages now emit
ConnectorAuditEntryrows . - Retention-to-blob deletion handoff for ContentAddressed snapshots; credential-bearing
params.bodycontent redacted before truncation .
Multi-Agent @mention Collaboration
- Foundation: message and agent-run data model extensions for mentions, parent run chains, and forwarded messages .
- @mention autocomplete in the chat input with profile picker and inline chip preview .
- Main-agent orchestration and task delegation service routing @mention requests to sub-agent profiles .
- Mention chip rendering in user messages and assistant sub-agent attribution on reply bubbles .
- Real-time execution status UI for mention chips and chat — live run progress, stall, and error states .
- No-mention continuity (last responder retains the turn) and parallel mention dispatch .
- Polish pass — header relabel, i18n strings, docs, integration validation .
Personal Governance & Policy (Phase B)
- Policy-triggered approval prompt with inline policy edit from the approval dialog .
- Policy surface in Settings .
- Governance events emitted on guardrail and limit rule changes .
- IANA timezone names supported for limit day-boundary calculations .
Models, Agent Tools, and Chat
- New
generate_imageagent tool for LLM-autonomous image creation, wired to the existing Draw / sd-server stack . - Recommended utility-model registry as a single source of truth for memory-extraction and title-generation models, with on-demand auto-load, lifecycle toasts, onboarding suggestion, and Settings UI to pick extraction & title models independently .
- Per-session
preserve_thinkingoverride with tri-state UI in the Chat Parameters Drawer . thinking_budget_tokensandpreserve_thinkingsupport for Qwen models .- Models page table view backed by the shared
ViewModeToggle. - Bench harness for memory-extraction and title-model output quality .
Server, Distribution, and UI Foundations
aigo-servermanpage and headless.debpackaging for Linux server deployment .- Sidebar header unified with the main toolbar (macOS traffic-light fix included) .
- Streaming audit-row scan for
collect_live_store_refsso very large audit stores no longer block on full materialization .
Improvements
- Email read action contexts thread
GovernanceHint::Silentthroughinvoke_with_governancefor full parity with Calendar . - First-class
metadataslot onOperationResultfor connector-specific receipt data . - Settings: align Email and Calendar connector design under the same layout .
- Refresh whitelisted default models for cloud providers .
- Serialize utility LLM calls (memory extraction, title generation) via a promise-chained queue to prevent slot contention with the active chat .
- Models menu no longer surfaces running models — moved to the header status pill and Sessions UI .
- Multi-session aliases align after router suffixing so
/v1/modelsand selectors stay coherent across reloads ( follow-up). - Memory extraction notification now explains why 0 entries were saved (no new facts, parse failure, validation failure, all duplicates) instead of an opaque "0 saved" .
- Unify router endpoint resolution for Tauri commands and REST handlers via
RouterEndpointResolvertrait . - Make GGUF arch validation permissive with improved failure errors .
- Email connector UI + adapter polish .
- Wrap connector credentials in zeroize-on-drop
SecretString. - Squad Overview activity grid + timeline integration and UI polish .
- Align policies rule drawer with the canonical
Drawerlayout . - Migrate governance UI raw elements to common components .
- Use fs4 for cross-platform disk space detection in engine commands .
- Codify
before_statevsundo_tokenprecedence inconnectors-trait.mdfor connector authors .
Bug Fixes
- Loaded MLX/local models in the main model selector display the same name as the router/Continuum dropdown instead of "Model.safetensors" .
- Use named exports for date-fns v4 locale loaders — fixes
Cannot access 'es' before initializationstartup crash that prevented v1.7.0-beta.3 from running . - Strip
· port {port} · {n}k ctxsuffix fromSessionSummary.displayNamefor LLM-serving sessions to avoid duplicating columns . - Sessions: complete i18n, accessibility, and responsive QA pass .
- Providers: sync router and enrich
selected_modelson Refresh . - Stabilized unified Sessions runtime identities and lifecycle history; encoded/validated session history filenames defensively .
- Ensure terminated sessions appear in the History tab .
- Cancel in-flight tool execution on cowork stop signal; Cowork stop button actually halts the running task .
- Sub-agent tool approval dialog surfaces in the chat surface so runs no longer stall .
- Sub-agent approval prompts no longer surface in the wrong chat session when the user switches sessions; switching sessions no longer leaves approval-waiting sub-agents stalled .
- Scope sub-agent approval surface to the active chat session so approvals don't leak across sessions .
- Sub-agent retains its prior reply when the user sends a no-mention follow-up, preventing repeated clarifying questions .
- Parallel
fetch_urlcalls no longer block when approved withremember=false. - Headless file and event APIs hardened for permission and lifecycle edge cases .
- Epic 1047 agent tools hardening pass .
- Complete node registration pairing flow .
- Address epic 2759 review gaps and headless gating .
- Memory extraction empty-reason surfacing in chat UI notification + Rust diagnostic logging under
memory::extraction. - Title-generation prompt, validation, retry behavior unified with the recommended utility model;
parseBareModelIdapplied; Qwen3-specific/no_thinkprefix removed; memory extraction serialized before title generation . - Title generation no longer races memory extraction for the local single-completion slot .
- Title generation no longer injects the Qwen3-specific
/no_thinkcontrol token into prompts for other model families . - Sub-agent run hangs after spawn — reject the literal
defaultmodel alias to recover . - Resolve @mention delegation failures for the Main Agent and built-in profiles; complete delegation follow-ups; flip autocomplete popover when clipped by the viewport .
- Stabilize Hugging Face download manager: delete, retry, cancel/retry race, and queue persistence .
- Chat memory extraction persists saved memories and the UI distinguishes success and failure outcomes .
- Detect token exhaustion inside reasoning blocks via request config .
- MLX capability detector identifies audio/video on multimodal Qwen3.5/3.6 models; fall back to
chat_template.jinjafor tool-calling detection . - Close email governance and rollback gaps .
- Enter Tokio runtime context before spawning the retention scheduler so
make devno longer panics in the AppKit delegate . - Strip MLX quantization suffix (
-4bit,_4bit,.4bit, etc.) in Rust alias derivation so model aliases match the TypeScript frontend . - Capture per-chunk undo ids and propagate all-failed across channel multi-chunk sends .
- Stabilize download queue height with max-3-item constraint and smooth transitions .
- Forward
top_k,min_p,frequency_penalty,presence_penalty,repeat_penalty, andseedover the Unix-socket transport — six sampling fields were silently dropped for all socket-backed models on macOS . - Context-window indicator no longer drops to 0% between mult...
v1.6.1
Backend.AI GO 1.6.1 ships OS credential vault, per-agent spending and rate limits, step reasoning retention, plus aarch64 Linux and Squad monitor stability fixes.
Backend.AI GO v1.6.1
10 commits since v1.6.0. (15461 lines added, 146 lines deleted)
New Features
- OS credential vault integration — API keys, secrets, and inference credentials are now stored in the operating system's native keyring (macOS Keychain, Windows Credential Manager, Linux Secret Service) instead of plain text on disk.
- Connector trait and capability model design — Foundational trait abstraction for plugging in new external integrations with declared capabilities.
- Conversational guardrail model primitives and storage — Configurable safety boundaries for chat with reusable storage shared across agents.
- Per-agent, per-day, per-tool spending and rate limits — Fine-grained controls let operators cap cost and usage by agent, day, and individual tool, with a persisted ledger and replenishment engine.
- Reversible-by-design action audit schema — Every recorded action carries the metadata needed to undo it, laying the groundwork for safe automated rollbacks.
- Step reasoning retention and display — Each agent's chain-of-thought is preserved across runs and surfaced in the run detail view so you can replay how an answer was reached.
Improvements
- What's New modal content refreshed across all six locales (English, Korean, Japanese, Spanish, Traditional Chinese, Simplified Chinese) with v1.6.1 highlights.
- CHANGELOG and README Recent Updates section refreshed for the v1.6.1 maintenance release.
Bug Fixes
- aarch64 Linux build restored after toolchain regressions, and the Squad monitor re-render loop that caused runaway re-renders on active squads has been eliminated.
- Container CLI check parser correctly handles the updated
container-clioutput format. - Squad workspace self-heal automatically recovers from inconsistent or partial workspace state on launch.
- Tauri runtime startup panic in spawn agent limits init resolved by binding the limits initializer to the Tauri runtime.
CI/CD Improvements
None.
Technical Details
- OS credential vault uses the existing
keyringcrate with platform-specific backends (apple-native,windows-native,sync-secret-service). - Conversational guardrail and reversible action audit work introduces new SQLite tables and schema migrations.
- Spending and rate-limit ledger is persisted per agent with daily and per-tool quotas managed by a dedicated rate-limit engine.
- Step reasoning is stored alongside each agent step so it survives across run boundaries and is rendered in the run detail view.
- Connector trait and capability model are pure design scaffolding in this release; no user-visible connector is enabled yet.
Dependencies
None.
Breaking Changes
None.
Known Issues
None.
Full Changelog
Backend.AI GO v1.6.0
Backend.AI GO v1.6.0 ships the Squad Overview tab with live Agent Activity Grid and Execution Timeline, a full CLI suite for headless operation, and massive squad, agent, and chat state persistence fixes across navigation.
Backend.AI GO v1.6.0
202 commits since v1.5.4. (171,055 lines added, 60,288 lines deleted)
New Features
- Squad Overview tab with live Agent Activity Grid and chronological Execution Timeline (E1-8:, E1-9:, parent,)
- TokenUsageBar, AgentActivityCard common components, activity summary and stall-detection selectors, and
squadTimelineSliceZustand slice powering the new Squad Overview - Full CLI suite for headless operation: Agent Runtime , Node/Mesh networking , Squad Management , and Supervisor policy/monitoring
- Startup section in Settings → General with auto-load model policy (none / lastUsed / explicit), sequential loader with RAM budget and timeout, landing page selector, and auto-restore chat session opt-out (–)
- Auto-restore most recent chat session on
/chatentry with opt-out - Unified agent activity state model with dynamic liveness thresholds per activity type and token-stream heartbeat for streaming inference steps
- Background execution hardening for long-running jobs
- Tray residency policy with onboarding prompt
- Approval-waiting pinned section with cross-squad aggregation
- Rich Team Dashboard with agent row list, name filter, and status chip toggles
- Independent headless build without desktop feature dependency , plus headless diffusion browser, file picker, directory selection
- Standalone
.baimodelpackager script and fast-head manifest reader that inspects bundles without scanning the full archive - Auto-select model after loading with Start Chat notification action
--parallelparameter configuration for inference servers- Engine auto-update toggle in Settings → General → Updates
- Support new GGUF split format (
name-NNNNN-of-NNNNN.gguf)
Improvements
- Complete shared-runtime refactor closing headless/desktop parity across engine, router, scheduler, squad, supervisor, process, diffusion, plugin, channel, provider, translation, mcp, and creation flows
- Lock-free routing table for the inference hot path eliminates chat freezes during concurrent model loads
- Canonical API layer architecture with frozen legacy
tauri.ts, domain adapter methods, and component-level call migration - Native
async fnin traits replacing theasync-traitcrate - Typed Zustand stores replace
window.dispatchEventinternal protocol tokio::fsreplaces syncstd::fsin async contexts- State persistence audit across squad/agent navigation — scroll, drafts, and log streams now survive tab switches
- Major codebase decomposition:
adapter.ts(3978 → 281 lines),squadStore.ts(1515 → 32 lines barrel),modelStore.ts,hfStore.ts,agentStore.ts,clawStore.ts,chatApi.ts,chatStore.ts,src/types/squad.ts,lib.rs,management_api/server.rs,models/manager.rs,settings/types.rs,SettingsPage,ModelsPage,ApiSettingsPage(,,,,–,,,–) - Consolidate shared domain types into core and unify state adapter layer
- Enforce domain service access pattern for extension areas
- Single source of truth mandate for Tauri/REST parity with
api-parityrules extended to filesystem operations - Common UI component usage promoted to lint/PR checklist
- Emphasize Backend.AI GO as an Agentic AI Platform on webpage
Bug Fixes
- Squad/agent/chat state persistence: SquadChat container log streams, monitored squad / activity feed / token usage, SquadMonitor UI state, BudgetMeter subscriptions, squad event subscriptions, AgentChat mount-time refetch, squad monitor drafts, ChannelsTab and AgentPage/CoworkPage cleanup handlers no longer wipe state on unmount (–,,,)
- Chat freeze during model load caused by outer Mutex on
InferenceCoordinator - Chat cancellation now propagates to backend and frees inference server slots
- Graceful shutdown on macOS Cmd+Q and SIGTERM cleanly releases inference slots and cancels in-flight chat streams
- GGUF model deletion now cleans up orphan directories and stale model cards
- Sharded MLX model stability fixes — disappearing models, wrong IDs, empty structure cards
- MLX capability auto-detection (vision, audio, tool calling) from
config.json - Null
audio_configguard and tool-calling detection from tokenizer special tokens - Progress race condition between timer task and coordinator
- Squad approval context propagation through agent runtime
- Tokio runtime entry before wiring suspend detector
- Headless data directory isolation and REST response shape alignment
- Headless flows: translation file handling, directory selection, session restore notification with model loading
- Register
/startup/apply-model-policyroute scope in Management API - Repair auto-load review regressions in the Startup flow
- Auto-select and Start Chat not working after model loading
- Pass
--jinjaflag to mlxcel engine for tool calling support - Security: enforce originating key scopes on session-authenticated requests , align Secure cookie flag with TLS state , fail startup when setup token generation fails , propagate real caller identity to registry audit entries , propagate TLS config to ServerConfig
- Numeric GPU temperature on macOS with all-smi 0.19.0
- Missing i18n strings for aria-labels and node titles
- Chat context not shared between demo playbook main prompt and follow-up questions
- Fall back to chat model when utility model is unavailable for title generation
- Filter active downloads from orphaned download detection
- Linux keyring dependency leaking into headless builds
- Explicit headless graceful shutdown on SIGTERM
CI/CD Improvements
- Criterion smoke benchmarks covering critical performance paths
- Security regression suite for the integrated Tauri + headless architecture
- Architecture check script with file size threshold warnings
- Automated Team Dashboard acceptance tests
- API parity verification promoted from documentation to automated tests
- Bump GitHub Actions to Node 24 compatible versions
- Teams release notification added to packaging workflow
make watch-servertarget for bgo-server hot rebuild- libdrm installed in CI so headless GPU monitoring works on Linux runners
- Resolve lint, format, and clippy warnings across the codebase
Technical Details
- Shared runtime bridges and service adapters route all domain services (engine, router, scheduler, squad, supervisor, process, diffusion, plugin, channel, provider, translation, mcp, creation) through a single runtime, enabling full parity between the desktop app and headless
aigo-server. - Canonical API layer architecture freezes legacy
tauri.tsand promotes all backend calls through domain adapter methods — component-leveltauriInvokecalls were migrated to the adapter layer and ESLint rules enforce the domain boundary. - Unified agent activity state model provides a single source of truth for agent status across Squad Overview, Team Dashboard, and the new chronological Execution Timeline. Dynamic liveness thresholds per activity type and token-stream heartbeat during inference steps eliminate false-positive stall detection on long-running jobs.
- Lock-free inference routing table removes the outer Mutex on
InferenceCoordinatorthat previously serialized chat completions behind background model loads. - State persistence audit rewired subscription lifecycles at the store level so squad/agent/chat UI state (scroll, drafts, log streams, container logs, budget, approvals) now survives navigation across tabs and pages.
- Codebase decomposition broke up oversized modules (
adapter.ts3978 → 281-line barrel,squadStore.ts1515 → 32-line barrel,lib.rs,management_api/server.rs,models/manager.rs,settings/types.rs,SettingsPage,ModelsPage,ApiSettingsPage,chatStore.ts, etc.) into subdomain slices, service modules, and section containers, aided by a new architecture check script with file size threshold warnings. - DTO validation and API parity tests promoted from documentation to automated test suites now guard Rust↔TypeScript serialization and Tauri/REST endpoint parity.
Dependencies
- Upgrade all Cargo dependencies and fix pre-existing test failures
- llama.cpp → b8665
- mlxcel → 0.0.23 (from 0.0.15)
- all-smi → 0.19.0
- GitHub Actions bumped to Node 24 compatible versions
async-traitcrate removed in favor of nativeasync fnin traits
Breaking Changes
bgo/bago→aigorename . The CLI binary, URL scheme, and internal identifiers have been renamed toaigo.bgo://deep links and the legacybgoCLI command are no longer supported. Update scripts, launch shortcuts, and integrations accordingly.mlx-server→mlxcel-serverrename across docs and architecture notes .- Legacy
tauri.tsfrozen . All new backend calls must go through the canonical domain adapter layer. DirecttauriInvokeimports in components and pages are now flagged by ESLint; Squad/Plugin/Cowork pages have boundary regression tests that block direct transport imports. - Major store decomposition (–):
adapter.ts,squadStore.ts,modelStore.ts,hfStore.ts,agentStore.ts,clawStore.ts,chatApi.ts,chatStore.ts, andsrc/types/squad.tsare now barrels that re-export from subdomain slices. Internal imports should use the barrel path; deep imports into former internal files may break.
Known Issues
None.
What's Changed
- fix(security): enforce originating key scopes on session-authenticated req...
v1.6.0-canary.260406
Canary release (260406)
This is a bleeding-edge canary build for testing purposes.
Update Channel: Canary
Base Version: 1.6.0
Build Date: 2026-04-06
⚠️ Warning: Canary releases may contain unstable features and bugs.
Use at your own risk. Not recommended for production use.
v1.5.4
Fix MLX model inference, propagate all model config parameters, and harden Management API security.
Backend.AI GO 1.5.4
42 commits since v1.5.3.
New Features
- Qwen-Image multi-component model support for vision-language tasks
- Smooth auto-scroll during streaming chat responses
- Qwen3/3.5 thinking mode control via reasoningEffort mapping to chat_template_kwargs
- Local update test server for pre-release E2E testing with
BGO_UPDATE_URLenv var override - Install-phase progress UI with countdown timer and per-step status
- Scope-aware authorization middleware for Management API
- Per-route required scope mapping for all protected routes
- Audit logging for auth failures, permission denials, and sensitive access
- Repeat penalty parameter added to chat UI, chat API config, and llama-server args
Improvements
- Switch MLX model download filter from allowlist to blocklist — automatically includes new auxiliary files like
chat_template.jinjaandprocessor_config.json - Propagate all 22 model drawer parameters to inference server CLI args (sampling, context, hardware, RoPE, DRY penalty)
- Add ESLint rules to forbid direct tauri.ts imports and tauriInvoke calls
- Add route scope coverage baseline test
- Add libprotobuf-dev to Docker build for protobuf well-known types
Bug Fixes
- Fix Gemma 4 models producing garbage output on mlxcel engine due to missing
chat_template.jinja - Fix macOS auto-update hang caused by resource fork metadata (
._files) in updater tar.gz - Prevent indefinite hang during auto-update by keeping safety nets active through install/restart phase
- Prevent partial release sync to public repository when any platform build fails
- Remove duplicate download progress bar in model detail view
- Resolve update-and-restart flow failures from UI mismatch, safety-net race, and post-shutdown network call
- Show meaningful model metadata in Dashboard ModelStatusWidget
- Correct navigation target in SdServerUnavailable engine settings button
- Detect and clean up orphaned mlxcel-server processes on app restart
- Replace fixed sleep with process exit polling during router shutdown
- Audit CSP unsafe-inline and apply inline style removals
- Restrict shell.open to
bago://protocol allowlist - Redesign bootstrap admin key policy for external access mode
- Add conditional Secure cookie policy based on binding mode
- Add scope escalation prevention on admin/keys endpoints
- Disable appstream-compose in Flatpak manifest
- Add repeatPenalty validation and model config loading in chat store
CI/CD Improvements
- Prevent release sync when any platform build fails — finalize job now checks all build results
- Scope App token to repo and resolve node IDs via GraphQL lookup in project automation workflow
Technical Details
- MLX model download uses blocklist instead of allowlist for auxiliary files
- All 22 model config parameters (sampling, context, hardware, RoPE, DRY) now flow from UI → ModelConfig → ServerConfig → CLI args
- New
is_excluded_filefunction replaces the oldis_config_fileallowlist approach LLAMA_ONLY_FLAGSandLLAMA_ONLY_VALUEDupdated for non-llama engine compatibility
Dependencies
- mlxcel updated to v0.0.15
Breaking Changes
None
Known Issues
None