From d236cb4680bde8815aa521bef3ffb7ebae1e0be2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 10 Apr 2026 21:23:29 +0100 Subject: [PATCH] chore: enable redundant type constituent checks --- .oxlintrc.json | 1 - .../runtime-internals/mcp-command-line.test.ts | 2 +- .../browser/control-auth.auto-token.test.ts | 18 +++++++++++++----- .../src/cli/browser-cli.test-support.ts | 9 ++------- extensions/diffs/src/browser.test.ts | 10 +++++++--- extensions/diffs/src/tool.test.ts | 2 +- .../native-command.commands-allowfrom.test.ts | 4 +--- .../feishu/src/lifecycle.test-support.ts | 6 ++---- .../monitor.acp-init-failure.lifecycle.test.ts | 4 ++-- .../src/monitor.bot-menu.lifecycle.test.ts | 3 +-- .../src/monitor.card-action.lifecycle.test.ts | 3 +-- .../src/monitor.reply-once.lifecycle.test.ts | 3 +-- .../src/test-support/lifecycle-test-support.ts | 2 +- .../feishu/src/tool-factory-test-harness.ts | 10 ++++------ .../src/mattermost/reply-delivery.test.ts | 2 +- .../memory-core/src/dreaming-command.test.ts | 8 ++++---- .../memory-core/src/memory/qmd-manager.test.ts | 2 +- .../msteams/src/channel.directory.test.ts | 10 ++++------ extensions/qa-lab/src/lab-server.test.ts | 2 +- .../event-handler.inbound-context.test.ts | 4 ++-- .../bot.create-telegram-bot.test-harness.ts | 13 +++++++++---- extensions/telegram/src/network-config.test.ts | 8 +++----- extensions/voice-call/src/webhook.test.ts | 6 +++--- .../openclaw-tools.session-status.test.ts | 2 +- .../host/embeddings-provider.test-support.ts | 16 +++++++++++++--- 25 files changed, 79 insertions(+), 71 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index 06d7dad237a..c95c8191ff4 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -59,7 +59,6 @@ ], "rules": { "typescript/no-explicit-any": "off", - "typescript/no-redundant-type-constituents": "off", "typescript/unbound-method": "off", "eslint/no-unsafe-optional-chaining": "off" } diff --git a/extensions/acpx/src/runtime-internals/mcp-command-line.test.ts b/extensions/acpx/src/runtime-internals/mcp-command-line.test.ts index 9ef9c2b5f9b..739c6f29924 100644 --- a/extensions/acpx/src/runtime-internals/mcp-command-line.test.ts +++ b/extensions/acpx/src/runtime-internals/mcp-command-line.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; type SplitCommandLine = ( value: string, - platform?: NodeJS.Platform | string, + platform?: string, ) => { command: string; args: string[]; diff --git a/extensions/browser/src/browser/control-auth.auto-token.test.ts b/extensions/browser/src/browser/control-auth.auto-token.test.ts index 118683dc8a6..c8cba98c152 100644 --- a/extensions/browser/src/browser/control-auth.auto-token.test.ts +++ b/extensions/browser/src/browser/control-auth.auto-token.test.ts @@ -9,7 +9,7 @@ const mocks = vi.hoisted(() => ({ ({ authConfig, }: { - authConfig?: NonNullable["auth"]> | undefined; + authConfig?: NonNullable["auth"]>; }) => { const token = typeof authConfig?.token === "string" @@ -58,6 +58,14 @@ vi.mock("../gateway/auth.js", () => ({ resolveGatewayAuth: mocks.resolveGatewayAuth, })); +function readPersistedConfig(): OpenClawConfig { + const persistedCfg = mocks.writeConfigFile.mock.calls[0]?.[0]; + if (!persistedCfg) { + throw new Error("expected persisted config"); + } + return persistedCfg; +} + let ensureBrowserControlAuth: typeof import("./control-auth.js").ensureBrowserControlAuth; describe("ensureBrowserControlAuth", () => { @@ -176,7 +184,7 @@ describe("ensureBrowserControlAuth", () => { expect(result.auth.token).toBe(result.generatedToken); expect(result.auth.password).toBeUndefined(); expect(mocks.writeConfigFile).toHaveBeenCalledTimes(1); - const persistedCfg = mocks.writeConfigFile.mock.calls[0]?.[0] as OpenClawConfig | undefined; + const persistedCfg = readPersistedConfig(); expect(persistedCfg?.gateway?.auth?.mode).toBe("none"); expect(persistedCfg?.gateway?.auth?.token).toBe(result.generatedToken); expect(mocks.ensureGatewayStartupAuth).not.toHaveBeenCalled(); @@ -223,7 +231,7 @@ describe("ensureBrowserControlAuth", () => { expect(result.auth.token).toBe(result.generatedToken); expect(result.auth.password).toBeUndefined(); expect(mocks.writeConfigFile).toHaveBeenCalledTimes(1); - const persistedCfg = mocks.writeConfigFile.mock.calls[0]?.[0] as OpenClawConfig | undefined; + const persistedCfg = readPersistedConfig(); expect(persistedCfg?.gateway?.auth?.mode).toBe("none"); expect(persistedCfg?.gateway?.auth?.token).toBe(result.generatedToken); expect(mocks.ensureGatewayStartupAuth).not.toHaveBeenCalled(); @@ -246,7 +254,7 @@ describe("ensureBrowserControlAuth", () => { expect(result.auth.password).toBe(result.generatedToken); expect(result.auth.token).toBeUndefined(); expect(mocks.writeConfigFile).toHaveBeenCalledTimes(1); - const persistedCfg = mocks.writeConfigFile.mock.calls[0]?.[0] as OpenClawConfig | undefined; + const persistedCfg = readPersistedConfig(); expect(persistedCfg?.gateway?.auth?.mode).toBe("trusted-proxy"); expect(persistedCfg?.gateway?.auth?.password).toBe(result.generatedToken); expect(mocks.ensureGatewayStartupAuth).not.toHaveBeenCalled(); @@ -273,7 +281,7 @@ describe("ensureBrowserControlAuth", () => { expect(result.auth.password).toBe(result.generatedToken); expect(result.auth.token).toBeUndefined(); expect(mocks.writeConfigFile).toHaveBeenCalledTimes(1); - const persistedCfg = mocks.writeConfigFile.mock.calls[0]?.[0] as OpenClawConfig | undefined; + const persistedCfg = readPersistedConfig(); expect(persistedCfg?.gateway?.auth?.mode).toBe("trusted-proxy"); expect(persistedCfg?.gateway?.auth?.password).toBe(result.generatedToken); expect(mocks.ensureGatewayStartupAuth).not.toHaveBeenCalled(); diff --git a/extensions/browser/src/cli/browser-cli.test-support.ts b/extensions/browser/src/cli/browser-cli.test-support.ts index ac5a53f4c84..ee12986e3ff 100644 --- a/extensions/browser/src/cli/browser-cli.test-support.ts +++ b/extensions/browser/src/cli/browser-cli.test-support.ts @@ -1,12 +1,7 @@ import { Command } from "commander"; -import type { GatewayRpcOpts } from "openclaw/plugin-sdk/browser-node-runtime"; import { createCliRuntimeCapture } from "../../test-support.js"; import type { CliRuntimeCapture } from "../../test-support.js"; - -type BrowserParentOpts = GatewayRpcOpts & { - json?: boolean; - browserProfile?: string; -}; +import type { BrowserParentOpts } from "./browser-cli-shared.js"; export function createBrowserProgram(params?: { withGatewayUrl?: boolean }): { program: Command; @@ -25,7 +20,7 @@ export function createBrowserProgram(params?: { withGatewayUrl?: boolean }): { return { program, browser, parentOpts }; } -const browserCliRuntimeState = { capture: null as CliRuntimeCapture | null }; +const browserCliRuntimeState: { capture?: CliRuntimeCapture } = {}; export function getBrowserCliRuntimeCapture(): CliRuntimeCapture { browserCliRuntimeState.capture ??= createCliRuntimeCapture(); diff --git a/extensions/diffs/src/browser.test.ts b/extensions/diffs/src/browser.test.ts index 9db46f202e8..fd02bb8786b 100644 --- a/extensions/diffs/src/browser.test.ts +++ b/extensions/diffs/src/browser.test.ts @@ -1,5 +1,5 @@ import fs from "node:fs/promises"; -import type { IncomingMessage } from "node:http"; +import type { IncomingMessage, ServerResponse } from "node:http"; import path from "node:path"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { createMockServerResponse } from "../../../test/helpers/plugins/mock-http-response.js"; @@ -196,12 +196,16 @@ describe("diffs plugin registration", () => { type RegisteredTool = { execute?: (toolCallId: string, params: Record) => Promise; }; + type HttpRouteHandler = ( + req: IncomingMessage, + res: ServerResponse, + ) => boolean | Promise; type RegisteredHttpRouteParams = Parameters[0]; let registeredToolFactory: | ((ctx: OpenClawPluginToolContext) => RegisteredTool | RegisteredTool[] | null | undefined) | undefined; - let registeredHttpRouteHandler: RegisteredHttpRouteParams["handler"] | undefined; + let registeredHttpRouteHandler: HttpRouteHandler | undefined; const on = vi.fn(); const api = createTestPluginApi({ @@ -234,7 +238,7 @@ describe("diffs plugin registration", () => { registeredToolFactory = typeof tool === "function" ? tool : () => tool; }, registerHttpRoute(params: RegisteredHttpRouteParams) { - registeredHttpRouteHandler = params.handler; + registeredHttpRouteHandler = params.handler as HttpRouteHandler; }, on, }); diff --git a/extensions/diffs/src/tool.test.ts b/extensions/diffs/src/tool.test.ts index 4a2821dcebc..5370d2e0309 100644 --- a/extensions/diffs/src/tool.test.ts +++ b/extensions/diffs/src/tool.test.ts @@ -492,7 +492,7 @@ function createToolWithScreenshotter( store: DiffArtifactStore, screenshotter: DiffScreenshotter, defaults = DEFAULT_DIFFS_TOOL_DEFAULTS, - context: OpenClawPluginToolContext | undefined = { + context: OpenClawPluginToolContext = { agentId: "main", sessionId: "session-123", messageChannel: "discord", diff --git a/extensions/discord/src/monitor/native-command.commands-allowfrom.test.ts b/extensions/discord/src/monitor/native-command.commands-allowfrom.test.ts index ffb0178b131..e3198daf618 100644 --- a/extensions/discord/src/monitor/native-command.commands-allowfrom.test.ts +++ b/extensions/discord/src/monitor/native-command.commands-allowfrom.test.ts @@ -274,9 +274,7 @@ describe("Discord native slash commands with commands.allowFrom", () => { }, }); - const dispatchCall: - | Parameters[0] - | undefined = vi.mocked(dispatcherModule.dispatchReplyWithDispatcher).mock.calls[0]?.[0]; + const dispatchCall = vi.mocked(dispatcherModule.dispatchReplyWithDispatcher).mock.calls[0]?.[0]; await dispatchCall?.dispatcherOptions.deliver({ text: longReply }, { kind: "final" }); expect(interaction.followUp).toHaveBeenCalledWith( diff --git a/extensions/feishu/src/lifecycle.test-support.ts b/extensions/feishu/src/lifecycle.test-support.ts index 722e7c56c02..8e6044d7518 100644 --- a/extensions/feishu/src/lifecycle.test-support.ts +++ b/extensions/feishu/src/lifecycle.test-support.ts @@ -18,7 +18,7 @@ type DispatchReplyContext = Record & { SessionKey?: string; }; type DispatchReplyDispatcher = { - sendFinalReply: (payload: { text: string }) => unknown | Promise; + sendFinalReply: (payload: { text: string }) => unknown; }; type DispatchReplyFromConfigMock = Mock< (params: { @@ -26,9 +26,7 @@ type DispatchReplyFromConfigMock = Mock< dispatcher: DispatchReplyDispatcher; }) => Promise<{ queuedFinal: boolean; counts: DispatchReplyCounts }> >; -type WithReplyDispatcherMock = Mock< - (params: { run: () => unknown | Promise }) => Promise ->; +type WithReplyDispatcherMock = Mock<(params: { run: () => unknown }) => Promise>; type FeishuLifecycleTestMocks = { createEventDispatcherMock: UnknownMock; monitorWebSocketMock: AsyncUnknownMock; diff --git a/extensions/feishu/src/monitor.acp-init-failure.lifecycle.test.ts b/extensions/feishu/src/monitor.acp-init-failure.lifecycle.test.ts index 16fce5a3198..246c31c4f5a 100644 --- a/extensions/feishu/src/monitor.acp-init-failure.lifecycle.test.ts +++ b/extensions/feishu/src/monitor.acp-init-failure.lifecycle.test.ts @@ -1,7 +1,7 @@ import "./lifecycle.test-support.js"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createRuntimeEnv } from "../../../test/helpers/plugins/runtime-env.js"; -import type { ClawdbotConfig, RuntimeEnv } from "../runtime-api.js"; +import type { ClawdbotConfig } from "../runtime-api.js"; import { getFeishuLifecycleTestMocks } from "./lifecycle.test-support.js"; import { createFeishuLifecycleFixture, @@ -27,7 +27,7 @@ const { } = getFeishuLifecycleTestMocks(); let _handlers: Record Promise> = {}; -let lastRuntime: RuntimeEnv | null = null; +let lastRuntime: ReturnType | null = null; const originalStateDir = process.env.OPENCLAW_STATE_DIR; const { cfg: lifecycleConfig, account: lifecycleAccount } = createFeishuLifecycleFixture({ accountId: "acct-acp", diff --git a/extensions/feishu/src/monitor.bot-menu.lifecycle.test.ts b/extensions/feishu/src/monitor.bot-menu.lifecycle.test.ts index 7628f5fd045..4f97be7fe2f 100644 --- a/extensions/feishu/src/monitor.bot-menu.lifecycle.test.ts +++ b/extensions/feishu/src/monitor.bot-menu.lifecycle.test.ts @@ -1,6 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createRuntimeEnv } from "../../../test/helpers/plugins/runtime-env.js"; -import type { RuntimeEnv } from "../runtime-api.js"; import "./lifecycle.test-support.js"; import { getFeishuLifecycleTestMocks } from "./lifecycle.test-support.js"; import { @@ -30,7 +29,7 @@ const { } = getFeishuLifecycleTestMocks(); let _handlers: Record Promise> = {}; -let lastRuntime: RuntimeEnv | null = null; +let lastRuntime: ReturnType | null = null; const originalStateDir = process.env.OPENCLAW_STATE_DIR; const lifecycleConfig = createFeishuLifecycleConfig({ accountId: "acct-menu", diff --git a/extensions/feishu/src/monitor.card-action.lifecycle.test.ts b/extensions/feishu/src/monitor.card-action.lifecycle.test.ts index 7dd06b6db69..10682df8841 100644 --- a/extensions/feishu/src/monitor.card-action.lifecycle.test.ts +++ b/extensions/feishu/src/monitor.card-action.lifecycle.test.ts @@ -1,6 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createRuntimeEnv } from "../../../test/helpers/plugins/runtime-env.js"; -import type { RuntimeEnv } from "../runtime-api.js"; import "./lifecycle.test-support.js"; import { resetProcessedFeishuCardActionTokensForTests } from "./card-action.js"; import { createFeishuCardInteractionEnvelope } from "./card-interaction.js"; @@ -33,7 +32,7 @@ const { } = getFeishuLifecycleTestMocks(); let _handlers: Record Promise> = {}; -let lastRuntime: RuntimeEnv | null = null; +let lastRuntime: ReturnType | null = null; const originalStateDir = process.env.OPENCLAW_STATE_DIR; const lifecycleConfig = createFeishuLifecycleConfig({ accountId: "acct-card", diff --git a/extensions/feishu/src/monitor.reply-once.lifecycle.test.ts b/extensions/feishu/src/monitor.reply-once.lifecycle.test.ts index 67634165a71..1498837e446 100644 --- a/extensions/feishu/src/monitor.reply-once.lifecycle.test.ts +++ b/extensions/feishu/src/monitor.reply-once.lifecycle.test.ts @@ -1,6 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createRuntimeEnv } from "../../../test/helpers/plugins/runtime-env.js"; -import type { RuntimeEnv } from "../runtime-api.js"; import "./lifecycle.test-support.js"; import { getFeishuLifecycleTestMocks } from "./lifecycle.test-support.js"; import { @@ -30,7 +29,7 @@ const { } = getFeishuLifecycleTestMocks(); let _handlers: Record Promise> = {}; -let lastRuntime: RuntimeEnv | null = null; +let lastRuntime: ReturnType | null = null; const originalStateDir = process.env.OPENCLAW_STATE_DIR; const lifecycleConfig = createFeishuLifecycleConfig({ accountId: "acct-lifecycle", diff --git a/extensions/feishu/src/test-support/lifecycle-test-support.ts b/extensions/feishu/src/test-support/lifecycle-test-support.ts index 2693df30cbc..389767b8c2b 100644 --- a/extensions/feishu/src/test-support/lifecycle-test-support.ts +++ b/extensions/feishu/src/test-support/lifecycle-test-support.ts @@ -20,7 +20,7 @@ type FeishuDispatchReplyContext = Record & { SessionKey?: string; }; type FeishuDispatchReplyDispatcher = { - sendFinalReply: (payload: { text: string }) => unknown | Promise; + sendFinalReply: (payload: { text: string }) => unknown; }; type FeishuDispatchReplyMock = Mock< (args: { diff --git a/extensions/feishu/src/tool-factory-test-harness.ts b/extensions/feishu/src/tool-factory-test-harness.ts index 2b5e19c0d12..641e477866f 100644 --- a/extensions/feishu/src/tool-factory-test-harness.ts +++ b/extensions/feishu/src/tool-factory-test-harness.ts @@ -1,11 +1,9 @@ -import type { AnyAgentTool, OpenClawPluginApi } from "../runtime-api.js"; +import type { OpenClawPluginApi } from "../runtime-api.js"; type ToolContextLike = { agentAccountId?: string; }; -type ToolFactoryLike = (ctx: ToolContextLike) => AnyAgentTool | AnyAgentTool[] | null | undefined; - export type ToolLike = { name: string; execute: ( @@ -15,18 +13,18 @@ export type ToolLike = { }; type RegisteredTool = { - tool: AnyAgentTool | ToolFactoryLike; + tool: unknown; opts?: { name?: string }; }; -function toToolList(value: AnyAgentTool | AnyAgentTool[] | null | undefined): AnyAgentTool[] { +function toToolList(value: unknown): unknown[] { if (!value) { return []; } return Array.isArray(value) ? value : [value]; } -function asToolLike(tool: AnyAgentTool, fallbackName?: string): ToolLike { +function asToolLike(tool: unknown, fallbackName?: string): ToolLike { const candidate = tool as Partial; const name = candidate.name ?? fallbackName; const execute = candidate.execute; diff --git a/extensions/mattermost/src/mattermost/reply-delivery.test.ts b/extensions/mattermost/src/mattermost/reply-delivery.test.ts index d702b44e2d4..ff033553acd 100644 --- a/extensions/mattermost/src/mattermost/reply-delivery.test.ts +++ b/extensions/mattermost/src/mattermost/reply-delivery.test.ts @@ -24,7 +24,7 @@ function createReplyDeliveryCore(): DeliverMattermostReplyPayloadParams["core"] resolveChunkMode: vi.fn<() => ChunkMode>(() => "length"), resolveTextChunkLimit: vi.fn( ( - _cfg: OpenClawConfig | undefined, + _cfg?: OpenClawConfig, _provider?: string, _accountId?: string | null, opts?: { fallbackLimit?: number }, diff --git a/extensions/memory-core/src/dreaming-command.test.ts b/extensions/memory-core/src/dreaming-command.test.ts index 69b5fdb30bb..95c5361ec06 100644 --- a/extensions/memory-core/src/dreaming-command.test.ts +++ b/extensions/memory-core/src/dreaming-command.test.ts @@ -20,7 +20,7 @@ function resolveStoredDreaming(config: OpenClawConfig): Record } function createHarness(initialConfig: OpenClawConfig = {}) { - let command: OpenClawPluginCommandDefinition | undefined; + const registered: { command?: OpenClawPluginCommandDefinition } = {}; let runtimeConfig: OpenClawConfig = initialConfig; const runtime = { @@ -35,18 +35,18 @@ function createHarness(initialConfig: OpenClawConfig = {}) { const api = { runtime, registerCommand: vi.fn((definition: OpenClawPluginCommandDefinition) => { - command = definition; + registered.command = definition; }), } as unknown as OpenClawPluginApi; registerDreamingCommand(api); - if (!command) { + if (!registered.command) { throw new Error("memory-core did not register /dreaming"); } return { - command, + command: registered.command, runtime, getRuntimeConfig: () => runtimeConfig, }; diff --git a/extensions/memory-core/src/memory/qmd-manager.test.ts b/extensions/memory-core/src/memory/qmd-manager.test.ts index d119851a253..3054b11bdbe 100644 --- a/extensions/memory-core/src/memory/qmd-manager.test.ts +++ b/extensions/memory-core/src/memory/qmd-manager.test.ts @@ -145,7 +145,7 @@ describe("QmdMemoryManager", () => { let cfg: OpenClawConfig; const agentId = "main"; const openManagers = new Set(); - let embedStartupJitterSpy: ReturnType | null = null; + let embedStartupJitterSpy: { mockRestore: () => void } | null = null; function seedMemoryEmbeddingProviders(): void { (globalThis as Record)[MEMORY_EMBEDDING_PROVIDERS_KEY] = new Map([ diff --git a/extensions/msteams/src/channel.directory.test.ts b/extensions/msteams/src/channel.directory.test.ts index 35250913586..3a779380de4 100644 --- a/extensions/msteams/src/channel.directory.test.ts +++ b/extensions/msteams/src/channel.directory.test.ts @@ -7,18 +7,16 @@ import type { OpenClawConfig, RuntimeEnv } from "../runtime-api.js"; import { msteamsDirectoryAdapter } from "./directory.js"; import { resolveMSTeamsOutboundSessionRoute } from "./session-route.js"; -function requireDirectorySelf( - directory: typeof msteamsDirectoryAdapter | null | undefined, -): NonNullable<(typeof msteamsDirectoryAdapter)["self"]> { - if (!directory?.self) { +function requireDirectorySelf(): NonNullable<(typeof msteamsDirectoryAdapter)["self"]> { + if (!msteamsDirectoryAdapter.self) { throw new Error("expected msteams directory.self"); } - return directory.self; + return msteamsDirectoryAdapter.self; } describe("msteams directory", () => { const runtimeEnv = createDirectoryTestRuntime() as RuntimeEnv; - const directorySelf = requireDirectorySelf(msteamsDirectoryAdapter); + const directorySelf = requireDirectorySelf(); afterEach(() => { vi.unstubAllEnvs(); diff --git a/extensions/qa-lab/src/lab-server.test.ts b/extensions/qa-lab/src/lab-server.test.ts index 1d6b010b6c9..f83dcecb993 100644 --- a/extensions/qa-lab/src/lab-server.test.ts +++ b/extensions/qa-lab/src/lab-server.test.ts @@ -448,7 +448,7 @@ describe("qa-lab server", () => { const initialOutcomes = (await ( await fetchWithRetry(`${lab.baseUrl}/api/outcomes`) ).json()) as { - run: null | unknown; + run: unknown; }; expect(initialOutcomes.run).toBeNull(); diff --git a/extensions/signal/src/monitor/event-handler.inbound-context.test.ts b/extensions/signal/src/monitor/event-handler.inbound-context.test.ts index de9b4125c2c..4914d8efcf1 100644 --- a/extensions/signal/src/monitor/event-handler.inbound-context.test.ts +++ b/extensions/signal/src/monitor/event-handler.inbound-context.test.ts @@ -9,7 +9,7 @@ const [ const { sendTypingMock, sendReadReceiptMock, dispatchInboundMessageMock, capture } = vi.hoisted( () => { - const captureState: { ctx: MsgContext | undefined } = { ctx: undefined }; + const captureState: { ctx?: MsgContext } = {}; return { sendTypingMock: vi.fn(), sendReadReceiptMock: vi.fn(), @@ -53,7 +53,7 @@ vi.mock("../../../../src/pairing/pairing-store.js", () => ({ describe("signal createSignalEventHandler inbound context", () => { beforeEach(() => { - capture.ctx = undefined; + delete capture.ctx; sendTypingMock.mockReset().mockResolvedValue(true); sendReadReceiptMock.mockReset().mockResolvedValue(true); dispatchInboundMessageMock.mockClear(); diff --git a/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts b/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts index c620053dab3..21bf3915225 100644 --- a/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts +++ b/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts @@ -5,7 +5,6 @@ import { resetInboundDedupe, type GetReplyOptions, type MsgContext, - type ReplyPayload, } from "openclaw/plugin-sdk/reply-runtime"; import type { MockFn } from "openclaw/plugin-sdk/testing"; import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime"; @@ -27,6 +26,12 @@ type DispatchReplyWithBufferedBlockDispatcherResult = Awaited< ReturnType >; type DispatchReplyHarnessParams = Parameters[0]; +type ReplyPayloadLike = { + text?: string; + mediaUrl?: string; + mediaUrls?: string[]; + replyToId?: string; +}; const _EMPTY_REPLY_COUNTS: DispatchReplyWithBufferedBlockDispatcherResult["counts"] = { block: 0, @@ -119,7 +124,7 @@ const replySpyHoisted = vi.hoisted(() => ({ ctx: MsgContext, opts?: GetReplyOptions, configOverride?: OpenClawConfig, - ) => Promise + ) => Promise >, })); @@ -127,11 +132,11 @@ async function dispatchHarnessReplies( params: DispatchReplyHarnessParams, runReply: ( params: DispatchReplyHarnessParams, - ) => Promise, + ) => Promise, ): Promise { await params.dispatcherOptions.typingCallbacks?.onReplyStart?.(); const reply = await runReply(params); - const payloads: ReplyPayload[] = + const payloads: ReplyPayloadLike[] = reply === undefined ? [] : Array.isArray(reply) ? reply : [reply]; const dispatcher = createReplyDispatcher({ deliver: async (payload, info) => { diff --git a/extensions/telegram/src/network-config.test.ts b/extensions/telegram/src/network-config.test.ts index 8432d252c1d..000bd340ef6 100644 --- a/extensions/telegram/src/network-config.test.ts +++ b/extensions/telegram/src/network-config.test.ts @@ -187,9 +187,7 @@ describe("resolveTelegramDnsResultOrderDecision", () => { }, { name: "normalizes trimmed config values", - network: { dnsResultOrder: " Verbatim " } as TelegramNetworkConfig & { - dnsResultOrder: string; - }, + network: { dnsResultOrder: " Verbatim " } as unknown as TelegramNetworkConfig, nodeMajor: 20, expected: { value: "verbatim", source: "config" }, }, @@ -203,14 +201,14 @@ describe("resolveTelegramDnsResultOrderDecision", () => { { name: "ignores invalid env and config values before applying Node 22 default", env: { OPENCLAW_TELEGRAM_DNS_RESULT_ORDER: "bogus" }, - network: { dnsResultOrder: "invalid" } as TelegramNetworkConfig & { dnsResultOrder: string }, + network: { dnsResultOrder: "invalid" } as unknown as TelegramNetworkConfig, nodeMajor: 22, expected: { value: "ipv4first", source: "default-node22" }, }, ] satisfies Array<{ name: string; env?: NodeJS.ProcessEnv; - network?: TelegramNetworkConfig | (TelegramNetworkConfig & { dnsResultOrder: string }); + network?: TelegramNetworkConfig; nodeMajor: number; expected: ReturnType; }>)("$name", ({ env, network, nodeMajor, expected }) => { diff --git a/extensions/voice-call/src/webhook.test.ts b/extensions/voice-call/src/webhook.test.ts index 83f1c6b0878..fb52bab58be 100644 --- a/extensions/voice-call/src/webhook.test.ts +++ b/extensions/voice-call/src/webhook.test.ts @@ -24,9 +24,9 @@ const mocks = vi.hoisted(() => { }; return { - getRealtimeTranscriptionProvider: vi.fn< - (...args: unknown[]) => RealtimeTranscriptionProviderPlugin | undefined - >(() => realtimeTranscriptionProvider), + getRealtimeTranscriptionProvider: vi.fn<(...args: unknown[]) => unknown>( + () => realtimeTranscriptionProvider, + ), listRealtimeTranscriptionProviders: vi.fn(() => [realtimeTranscriptionProvider]), }; }); diff --git a/src/agents/openclaw-tools.session-status.test.ts b/src/agents/openclaw-tools.session-status.test.ts index 40f44b29013..f4516c6ec10 100644 --- a/src/agents/openclaw-tools.session-status.test.ts +++ b/src/agents/openclaw-tools.session-status.test.ts @@ -185,7 +185,7 @@ function createCommandsStatusRuntimeModuleMock() { primaryModelLabelOverride?: string; includeTranscriptUsage?: boolean; taskLineOverride?: string; - resolveDefaultThinkingLevel?: () => Promise | unknown; + resolveDefaultThinkingLevel?: () => unknown; }) => { resolveQueueSettingsMock({ channel: params.statusChannel, diff --git a/src/memory-host-sdk/host/embeddings-provider.test-support.ts b/src/memory-host-sdk/host/embeddings-provider.test-support.ts index e5809f750c1..5503d308c25 100644 --- a/src/memory-host-sdk/host/embeddings-provider.test-support.ts +++ b/src/memory-host-sdk/host/embeddings-provider.test-support.ts @@ -21,18 +21,28 @@ vi.mock("../../infra/net/fetch-guard.js", () => ({ })); type FetchPayloadFactory = (input: RequestInfo | URL, init?: RequestInit) => unknown; +type JsonResponseFetchMock = ReturnType> & { + preconnect: ( + url: string | URL, + options?: { dns?: boolean; tcp?: boolean; http?: boolean; https?: boolean }, + ) => void; + __openclawAcceptsDispatcher: true; +}; export type JsonFetchMock = ReturnType; -export function createJsonResponseFetchMock(payload: unknown | FetchPayloadFactory) { +export function createJsonResponseFetchMock(payload: FetchPayloadFactory): JsonResponseFetchMock; +export function createJsonResponseFetchMock(payload: unknown): JsonResponseFetchMock; +export function createJsonResponseFetchMock(payload: unknown) { const fetchMock = vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => { - const body = typeof payload === "function" ? payload(input, init) : payload; + const body = + typeof payload === "function" ? (payload as FetchPayloadFactory)(input, init) : payload; return new Response(JSON.stringify(body), { status: 200, headers: { "Content-Type": "application/json" }, }); }); - return withFetchPreconnect(fetchMock); + return withFetchPreconnect(fetchMock) as JsonResponseFetchMock; } export function createEmbeddingDataFetchMock(embeddingValues = [0.1, 0.2, 0.3]) {