* fix(config): seed configured provider model entries from catalog metadata
applyModelDefaults replaced omitted input/reasoning/cost/maxTokens on
models.providers entries with generic defaults at config load, erasing the
fact that the operator never authored them. An override entry that pins only
sizing fields materialized as a text-only, non-reasoning, zero-cost model,
which silently dropped vision-gated tools (most visibly the computer tool)
for that model downstream.
Seed omitted fields from the owning plugin manifest catalog row (same
provider+model id, using the existing id-normalization policies) before
falling back to generic defaults. Authored fields always win; entries with
no catalog row behave exactly as before.
* fix(config): preserve tiered pricing when seeding model cost defaults
resolveModelCost keeps only flat per-token fields; carry an authored or
catalog tieredPricing table through explicitly so cost defaulting does not
silently discard it.
Close terminal SSE and stateful notification streams through the owning lifecycle, and reap stdio/QA process groups before exact authority is discarded.\n\nRefs #126098, #126099, #126100.
* fix(subagents): drop dead announce gateway-context resolver plumbing
#126062 left caller-supplied announce gateway-context resolvers behind after binding dispatch to the Gateway instance. Remove the dead plumbing that broke prod-types in gateway-scope lanes.
* refactor(agents): consolidate session auth selection behind prepared-facts facade
Completes #123894's redesign by deduplicating the four session-auth call-site preludes and deleting inference-runtime's duplicate route re-derivation.
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
---------
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
* fix(test): run the shared Control UI lane on the cross-file cleanup runner
ui/vitest.config.ts drives CI's checks-ui job (pnpm --dir ui test). Its
unit project sets isolate:false but never wired
runner: nonIsolatedRunnerPath, so the per-file cleanup in
test/non-isolated-runner.ts — module-graph reset, repo-owned custom
element dropping, DOM body reset, timer and spy restoration — never ran
in the lane CI actually uses. Only the repo-root lane behind
scripts/run-vitest.mjs loaded it.
Files sharing a worker therefore kept the previous file's evaluated
modules, so whichever file imported a component first pinned it to the
real dependency and a later file's vi.mock factory never reached
production code, surfacing as "expected 0 to be 1" in whichever sibling
the size sequencer happened to pack alongside it. This is the class
PR #123512 diagnosed and fixed at the runner; the fix never reached this
lane, so the repo kept absorbing it one uiIsolatedTestFiles entry at a
time.
browser stays exempt (the runner imports node:fs and server modules that
cannot load in browser mode) and unit-node stays exempt (it carries the
Playwright-driven layout tests whose browser lives in module scope, which
per-file module resets churn). The config test asserted runner was
undefined for every project, pinning the broken wiring; it now asserts
the invariant and fails on the pre-fix config.
* fix(agents): stop passing an ignored resolver to instance-bound announce dispatch
check-prod-types is red on main: #126062 threaded resolveGatewayContext
into the announce dispatch call, but that call now goes through
dispatchGatewayLifecycleMethod, whose options type does not carry the
field.
The type checker is right that it does not belong there. That dispatcher
hands work to runtime.dispatchAgent, which resolves context from the
Gateway instance it is bound to and forwards a fixed option allowlist, so
a caller-supplied resolver was already being ignored. Dropping it is
behavior-preserving.
The delivery test asserted the resolver was forwarded, but production now
binds to the instance dispatcher while the test injects a mock, so that
assertion only proved the mock. It now asserts the resolver is
deliberately not forwarded.
Left for the owner of #126062: sendSubagentAnnounceDirectly and its
callers still accept and thread resolveGatewayContext, which is now
vestigial on this path. Deleting that chain or teaching the instance
runtime to honor the resolver is a design call on a just-landed change.
Keep automatic auth-profile rotation within the session current provider route so API-key sessions do not switch to subscription credentials across compaction or cooldown. Cross-route fallback remains owned by provider route planning.
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* improve(ui): make online sidebar section collapsible
* improve(ui): show online avatars in compact state
* improve(ui): align online section heading
* fix(ui): satisfy sidebar CI gates
* fix(ui): keep online expanded on first visit
`oxfmt --check` fails on main, which takes check-docs red on every PR. The
drift came in with #126055 in
.agents/skills/openclaw-release-validation/SKILL.md.
Formatting only, no content change.
The cloud machine picker described each class in prose ("Cheap smoke checks
and small repos"), which was the widest thing in the row, got ellipsized, and
did not say what the operator actually picks on. Machine options now carry the
class shape and the picker renders "32 vCPU · 64 GB" instead.
Crabbox reports per-provider class shapes from `providers --json`; the plugin
reads that catalog once per lifecycle and attaches cpu/memoryGb to each option.
A missing binary, failed command, unparseable output, absent classes, or an
unmatched provider all degrade to label-only rows, so an older Crabbox keeps
working.
`description` was never released, so it is removed rather than deprecated, and
listMachineOptions becomes async for the catalog read. Deletes the duplicate
machine-option projector in the environments server method.
The Control UI settings page (#124864) and the New Session place
picker's machine section had no doc coverage — the configuration and
dispatch walkthroughs only described the JSON/RPC paths.
Center sidebar session pin and menu actions across the full two-line row while reserving text width on hover and touch. Add browser geometry regression coverage.
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
* fix(copilot): add OpenClaw prompt guidance
Copilot append-mode system messages included credential safety, workspace bootstrap, and extra context but omitted OpenClaw delegation and reply-delivery policy.
Build guidance from the final policy-filtered tool surface so visible delegated work, Skill Workshop, and source replies follow the same behavior as Codex.
* fix(copilot): break prompt guidance import cycle
The CI architecture gate detected a cycle through attempt-config and prompt-guidance. Isolate raw-run mode detection in a leaf module.
* fix(gateway): apply configured edge auth to session-URL targets
Follow-up to #125700.
A URL target with explicit auth skipped config loading and silently dropped
gateway.remote.edgeAuth. Config I/O is now skipped only for plaintext loopback
targets.
Also document mandatory passEnv: ["HOME"] for the cloudflared exec provider.
* fix(gateway): keep explicit secure connections working when config is invalid
Addresses the ClawSweeper finding on #125982 by preserving the invalid-config recovery path while still applying configured edge auth.