Compare commits
16 Commits
main
...
codex/ui/d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a366349324 | ||
|
|
832343d38a | ||
|
|
b2cc50c863 | ||
|
|
aab43448ef | ||
|
|
1708043ffb | ||
|
|
007b136b8b | ||
|
|
6f62a6eceb | ||
|
|
ee04b228df | ||
|
|
814382002d | ||
|
|
268fdec2ce | ||
|
|
bbb6701b83 | ||
|
|
1765f3b6e8 | ||
|
|
734d0bd647 | ||
|
|
9505224316 | ||
|
|
1f974a4790 | ||
|
|
655a871ab0 |
@ -14,8 +14,10 @@ Docs: https://docs.openclaw.ai
|
|||||||
|
|
||||||
### Fixes
|
### 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.
|
- 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.
|
- 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.
|
- 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.
|
- 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.
|
- 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.
|
||||||
|
|||||||
@ -328,12 +328,14 @@ describe("BlueBubbles webhook monitor", () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createHangingWebhookRequest(url = "/bluebubbles-webhook?password=test-password") {
|
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();
|
const destroyMock = vi.fn();
|
||||||
req.method = "POST";
|
req.method = "POST";
|
||||||
req.url = url;
|
req.url = url;
|
||||||
req.headers = {};
|
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");
|
setRequestRemoteAddress(req, "127.0.0.1");
|
||||||
return { req, destroyMock };
|
return { req, destroyMock };
|
||||||
}
|
}
|
||||||
|
|||||||
@ -121,6 +121,12 @@ describe("model-selection", () => {
|
|||||||
defaultProvider: "anthropic",
|
defaultProvider: "anthropic",
|
||||||
expected: { provider: "anthropic", model: "claude-sonnet-4-6" },
|
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",
|
name: "normalizes deprecated google flash preview ids",
|
||||||
variants: ["google/gemini-3.1-flash-preview", "gemini-3.1-flash-preview"],
|
variants: ["google/gemini-3.1-flash-preview", "gemini-3.1-flash-preview"],
|
||||||
|
|||||||
@ -31,13 +31,6 @@ export type ModelAliasIndex = {
|
|||||||
byKey: Map<string, string[]>;
|
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 {
|
function normalizeAliasKey(value: string): string {
|
||||||
return value.trim().toLowerCase();
|
return value.trim().toLowerCase();
|
||||||
}
|
}
|
||||||
@ -151,7 +144,20 @@ function normalizeAnthropicModelId(model: string): string {
|
|||||||
return trimmed;
|
return trimmed;
|
||||||
}
|
}
|
||||||
const lower = trimmed.toLowerCase();
|
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 {
|
function normalizeProviderModelId(provider: string, model: string): string {
|
||||||
|
|||||||
@ -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 () => {
|
it("adds default cacheRetention for Anthropic Claude models on Bedrock", async () => {
|
||||||
await withTempHome(async (home) => {
|
await withTempHome(async (home) => {
|
||||||
await writeConfigForTest(home, {
|
await writeConfigForTest(home, {
|
||||||
|
|||||||
@ -34,8 +34,8 @@ import {
|
|||||||
} from "./invoke-system-run-plan.js";
|
} from "./invoke-system-run-plan.js";
|
||||||
import type {
|
import type {
|
||||||
ExecEventPayload,
|
ExecEventPayload,
|
||||||
ExecFinishedResult,
|
|
||||||
ExecFinishedEventParams,
|
ExecFinishedEventParams,
|
||||||
|
ExecFinishedResult,
|
||||||
RunResult,
|
RunResult,
|
||||||
SkillBinsProvider,
|
SkillBinsProvider,
|
||||||
SystemRunParams,
|
SystemRunParams,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user