Compare commits

...

16 Commits

Author SHA1 Message Date
Val Alexander
a366349324
Merge branch 'main' into codex/ui/dashboard-v2.1.1 2026-03-13 17:59:00 -05:00
Val Alexander
832343d38a
Merge origin/main into codex/ui/dashboard-v2.1.1 2026-03-13 17:57:59 -05:00
Val Alexander
b2cc50c863
fix(config): avoid Anthropic startup crash 2026-03-13 17:24:50 -05:00
Val Alexander
aab43448ef
test: fix merge gate regressions 2026-03-13 16:53:44 -05:00
Val Alexander
1708043ffb
Merge branch 'main' into ui/dashboard-v2.1 2026-03-13 16:46:37 -05:00
Val Alexander
007b136b8b
Merge branch 'main' into ui/dashboard-v2.1 2026-03-13 16:44:34 -05:00
Val Alexander
6f62a6eceb
Merge branch 'main' into ui/dashboard-v2.1 2026-03-13 16:42:56 -05:00
Val Alexander
ee04b228df
test: narrow shared ip fixtures to IPv4 2026-03-13 16:37:04 -05:00
Val Alexander
814382002d
Merge remote-tracking branch 'origin/main' into ui/dashboard-v2.1 2026-03-13 16:36:06 -05:00
Val Alexander
268fdec2ce
test: update outbound gateway client fixture values 2026-03-13 16:32:37 -05:00
Val Alexander
bbb6701b83
UI: address review feedback on agents refresh and chat styles 2026-03-13 16:30:06 -05:00
Val Alexander
1765f3b6e8
Merge branch 'main' into ui/dashboard-v2.1 2026-03-13 16:27:03 -05:00
Val Alexander
734d0bd647
test: stabilize vitest helper export types 2026-03-13 16:16:47 -05:00
Val Alexander
9505224316
Merge branch 'main' into ui/dashboard-v2.1 2026-03-13 16:08:48 -05:00
Val Alexander
1f974a4790
UI: polish agent skills, chat images, and sidebar status 2026-03-13 15:55:46 -05:00
Val Alexander
655a871ab0
style: update chat layout and spacing for improved UI consistency
- Adjusted margin and padding for .chat-thread and .content--chat to enhance layout.
- Consolidated CSS selectors for better readability and maintainability.
- Introduced new test for log parsing functionality to ensure accurate message extraction.
2026-03-13 14:30:43 -05:00
6 changed files with 51 additions and 11 deletions

View File

@ -14,8 +14,10 @@ Docs: https://docs.openclaw.ai
### Fixes
- Dashboard/agents and chat: scope the Agents > Skills view to the selected agent, restore clean sidebar status and log rendering, and keep oversized inline markdown images from expanding across the chat UI. (#45451) Thanks @BunsDev.
- Telegram/webhook auth: validate the Telegram webhook secret before reading or parsing request bodies, so unauthenticated requests are rejected immediately instead of consuming up to 1 MB first. Thanks @space08.
- Build/plugin-sdk bundling: bundle plugin-sdk subpath entries in one shared build pass so published packages stop duplicating shared chunks and avoid the recent plugin-sdk memory blow-up. (#45426) Thanks @TarasShyn.
- Dashboard/agents and chat: scope the Agents > Skills view to the selected agent, restore clean sidebar status and log rendering, and keep oversized inline markdown images from expanding across the chat UI. (#45451) Thanks @BunsDev.
- Browser/existing-session: accept text-only `list_pages` and `new_page` responses from Chrome DevTools MCP so live-session tab discovery and new-tab open flows keep working when the server omits structured page metadata.
- Ollama/reasoning visibility: stop promoting native `thinking` and `reasoning` fields into final assistant text so local reasoning models no longer leak internal thoughts in normal replies. (#45330) Thanks @xi7ang.
- Cron/isolated sessions: route nested cron-triggered embedded runner work onto the nested lane so isolated cron jobs no longer deadlock when compaction or other queued inner work runs. Thanks @vincentkoc.

View File

@ -328,12 +328,14 @@ describe("BlueBubbles webhook monitor", () => {
}
function createHangingWebhookRequest(url = "/bluebubbles-webhook?password=test-password") {
const req = new EventEmitter() as IncomingMessage;
const req = new EventEmitter() as IncomingMessage & {
destroy: (error?: Error) => IncomingMessage;
};
const destroyMock = vi.fn();
req.method = "POST";
req.url = url;
req.headers = {};
req.destroy = destroyMock as unknown as IncomingMessage["destroy"];
req.destroy = destroyMock as unknown as typeof req.destroy;
setRequestRemoteAddress(req, "127.0.0.1");
return { req, destroyMock };
}

View File

@ -121,6 +121,12 @@ describe("model-selection", () => {
defaultProvider: "anthropic",
expected: { provider: "anthropic", model: "claude-sonnet-4-6" },
},
{
name: "keeps dated anthropic model ids unchanged",
variants: ["anthropic/claude-sonnet-4-20250514", "claude-sonnet-4-20250514"],
defaultProvider: "anthropic",
expected: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
},
{
name: "normalizes deprecated google flash preview ids",
variants: ["google/gemini-3.1-flash-preview", "gemini-3.1-flash-preview"],

View File

@ -31,13 +31,6 @@ export type ModelAliasIndex = {
byKey: Map<string, string[]>;
};
const ANTHROPIC_MODEL_ALIASES: Record<string, string> = {
"opus-4.6": "claude-opus-4-6",
"opus-4.5": "claude-opus-4-5",
"sonnet-4.6": "claude-sonnet-4-6",
"sonnet-4.5": "claude-sonnet-4-5",
};
function normalizeAliasKey(value: string): string {
return value.trim().toLowerCase();
}
@ -151,7 +144,20 @@ function normalizeAnthropicModelId(model: string): string {
return trimmed;
}
const lower = trimmed.toLowerCase();
return ANTHROPIC_MODEL_ALIASES[lower] ?? trimmed;
// Keep alias resolution local so bundled startup paths cannot trip a TDZ on
// a module-level alias table while config parsing is still initializing.
switch (lower) {
case "opus-4.6":
return "claude-opus-4-6";
case "opus-4.5":
return "claude-opus-4-5";
case "sonnet-4.6":
return "claude-sonnet-4-6";
case "sonnet-4.5":
return "claude-sonnet-4-5";
default:
return trimmed;
}
}
function normalizeProviderModelId(provider: string, model: string): string {

View File

@ -73,6 +73,30 @@ describe("config pruning defaults", () => {
});
});
it("adds cacheRetention defaults for dated Anthropic primary model refs", async () => {
await withTempHome(async (home) => {
await writeConfigForTest(home, {
auth: {
profiles: {
"anthropic:api": { provider: "anthropic", mode: "api_key" },
},
},
agents: {
defaults: {
model: { primary: "anthropic/claude-sonnet-4-20250514" },
},
},
});
const cfg = loadConfig();
expect(
cfg.agents?.defaults?.models?.["anthropic/claude-sonnet-4-20250514"]?.params
?.cacheRetention,
).toBe("short");
});
});
it("adds default cacheRetention for Anthropic Claude models on Bedrock", async () => {
await withTempHome(async (home) => {
await writeConfigForTest(home, {

View File

@ -34,8 +34,8 @@ import {
} from "./invoke-system-run-plan.js";
import type {
ExecEventPayload,
ExecFinishedResult,
ExecFinishedEventParams,
ExecFinishedResult,
RunResult,
SkillBinsProvider,
SystemRunParams,