diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e61358e91e..adbaceac95e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ 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. - 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. diff --git a/extensions/bluebubbles/src/monitor.webhook-auth.test.ts b/extensions/bluebubbles/src/monitor.webhook-auth.test.ts index b72b95dc4cc..3685142508e 100644 --- a/extensions/bluebubbles/src/monitor.webhook-auth.test.ts +++ b/extensions/bluebubbles/src/monitor.webhook-auth.test.ts @@ -328,11 +328,13 @@ describe("BlueBubbles webhook monitor", () => { } function createHangingWebhookRequest(url = "/bluebubbles-webhook?password=test-password") { - const req = new EventEmitter() as IncomingMessage & { destroy: ReturnType }; + const req = new EventEmitter() as IncomingMessage & { + destroy: (error?: Error) => IncomingMessage; + }; req.method = "POST"; req.url = url; req.headers = {}; - req.destroy = vi.fn(); + req.destroy = vi.fn((_: Error | undefined) => req) as typeof req.destroy; setRequestRemoteAddress(req, "127.0.0.1"); return req; } diff --git a/extensions/matrix/src/matrix/monitor/events.test.ts b/extensions/matrix/src/matrix/monitor/events.test.ts index 3c08a0230d1..603344d323f 100644 --- a/extensions/matrix/src/matrix/monitor/events.test.ts +++ b/extensions/matrix/src/matrix/monitor/events.test.ts @@ -14,6 +14,17 @@ vi.mock("../send.js", () => ({ describe("registerMatrixMonitorEvents", () => { const roomId = "!room:example.org"; + function createRoomEvent(event: Partial): MatrixRawEvent { + return { + event_id: "$default", + sender: "@bot:example.org", + type: "m.room.message", + origin_server_ts: 0, + content: {}, + ...event, + } as MatrixRawEvent; + } + beforeEach(() => { sendReadReceiptMatrixMock.mockClear(); }); @@ -67,10 +78,10 @@ describe("registerMatrixMonitorEvents", () => { it("sends read receipt immediately for non-self messages", async () => { const { client, onRoomMessage, roomMessageHandler } = createHarness(); - const event = { + const event = createRoomEvent({ event_id: "$e1", sender: "@alice:example.org", - } as MatrixRawEvent; + }); roomMessageHandler("!room:example.org", event); @@ -81,22 +92,26 @@ describe("registerMatrixMonitorEvents", () => { }); it("does not send read receipts for self messages", async () => { - await expectForwardedWithoutReadReceipt({ - event_id: "$e2", - sender: "@bot:example.org", - }); + await expectForwardedWithoutReadReceipt( + createRoomEvent({ + event_id: "$e2", + sender: "@bot:example.org", + }), + ); }); it("skips receipt when message lacks sender or event id", async () => { - await expectForwardedWithoutReadReceipt({ - sender: "@alice:example.org", - }); + await expectForwardedWithoutReadReceipt( + createRoomEvent({ + sender: "@alice:example.org", + }), + ); }); it("caches self user id across messages", async () => { const { getUserId, roomMessageHandler } = createHarness(); - const first = { event_id: "$e3", sender: "@alice:example.org" } as MatrixRawEvent; - const second = { event_id: "$e4", sender: "@bob:example.org" } as MatrixRawEvent; + const first = createRoomEvent({ event_id: "$e3", sender: "@alice:example.org" }); + const second = createRoomEvent({ event_id: "$e4", sender: "@bob:example.org" }); roomMessageHandler("!room:example.org", first); roomMessageHandler("!room:example.org", second); @@ -110,7 +125,7 @@ describe("registerMatrixMonitorEvents", () => { it("logs and continues when sending read receipt fails", async () => { sendReadReceiptMatrixMock.mockRejectedValueOnce(new Error("network boom")); const { roomMessageHandler, onRoomMessage, logVerboseMessage } = createHarness(); - const event = { event_id: "$e5", sender: "@alice:example.org" } as MatrixRawEvent; + const event = createRoomEvent({ event_id: "$e5", sender: "@alice:example.org" }); roomMessageHandler("!room:example.org", event); @@ -126,7 +141,7 @@ describe("registerMatrixMonitorEvents", () => { const { roomMessageHandler, onRoomMessage, getUserId } = createHarness({ getUserId: vi.fn().mockRejectedValue(new Error("cannot resolve self")), }); - const event = { event_id: "$e6", sender: "@alice:example.org" } as MatrixRawEvent; + const event = createRoomEvent({ event_id: "$e6", sender: "@alice:example.org" }); roomMessageHandler("!room:example.org", event); diff --git a/src/commands/onboard-non-interactive.gateway.test.ts b/src/commands/onboard-non-interactive.gateway.test.ts index 23684eb5f5a..c711b6922af 100644 --- a/src/commands/onboard-non-interactive.gateway.test.ts +++ b/src/commands/onboard-non-interactive.gateway.test.ts @@ -409,10 +409,10 @@ describe("onboard (non-interactive): gateway and remote auth", () => { let capturedError = ""; const runtimeWithCapture = { - log: () => {}, - error: (message: string) => { - capturedError = message; - throw new Error(message); + log: (..._args: unknown[]) => {}, + error: (...args: unknown[]) => { + capturedError = args.map(String).join(" "); + throw new Error(capturedError); }, exit: (_code: number) => { throw new Error("exit should not be reached after runtime.error"); diff --git a/src/node-host/invoke-system-run.ts b/src/node-host/invoke-system-run.ts index 32bd2d6ff79..336ccb08b19 100644 --- a/src/node-host/invoke-system-run.ts +++ b/src/node-host/invoke-system-run.ts @@ -35,6 +35,7 @@ import { import type { ExecEventPayload, ExecFinishedEventParams, + ExecFinishedResult, RunResult, SkillBinsProvider, SystemRunParams, diff --git a/src/slack/monitor/events/messages.test.ts b/src/slack/monitor/events/messages.test.ts index 25fdb77c025..f22b24a44c7 100644 --- a/src/slack/monitor/events/messages.test.ts +++ b/src/slack/monitor/events/messages.test.ts @@ -17,7 +17,6 @@ vi.mock("../../../pairing/pairing-store.js", () => ({ })); type MessageHandler = (args: { event: Record; body: unknown }) => Promise; -type AppMentionHandler = MessageHandler; type RegisteredEventName = "message" | "app_mention"; type MessageCase = {