diff --git a/extensions/device-pair/api.ts b/extensions/device-pair/api.ts index c3c349f120a..4c747939171 100644 --- a/extensions/device-pair/api.ts +++ b/extensions/device-pair/api.ts @@ -7,5 +7,8 @@ export { } from "openclaw/plugin-sdk/device-bootstrap"; export { definePluginEntry, type OpenClawPluginApi } from "openclaw/plugin-sdk/plugin-entry"; export { resolveGatewayBindUrl, resolveTailnetHostWithRunner } from "openclaw/plugin-sdk/core"; -export { resolvePreferredOpenClawTmpDir, runPluginCommandWithTimeout } from "openclaw/plugin-sdk/sandbox"; +export { + resolvePreferredOpenClawTmpDir, + runPluginCommandWithTimeout, +} from "openclaw/plugin-sdk/sandbox"; export { renderQrPngBase64 } from "../whatsapp/src/qr-image.js"; diff --git a/extensions/device-pair/index.test.ts b/extensions/device-pair/index.test.ts index e24043e056c..fc579d2fc6b 100644 --- a/extensions/device-pair/index.test.ts +++ b/extensions/device-pair/index.test.ts @@ -2,12 +2,12 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawPluginApi } from "./api.js"; import type { OpenClawPluginCommandDefinition, PluginCommandContext, } from "../../src/plugins/types.js"; import { createTestPluginApi } from "../../test/helpers/extensions/plugin-api.js"; +import type { OpenClawPluginApi } from "./api.js"; const pluginApiMocks = vi.hoisted(() => ({ clearDeviceBootstrapTokens: vi.fn(async () => ({ removed: 2 })), @@ -20,12 +20,11 @@ const pluginApiMocks = vi.hoisted(() => ({ resolvePreferredOpenClawTmpDir: vi.fn(() => path.join(os.tmpdir(), "openclaw-device-pair-tests")), })); -vi.mock("./api.js", async () => { - const actual = await vi.importActual("./api.js"); +vi.mock("./api.js", () => { return { - ...actual, approveDevicePairing: vi.fn(), clearDeviceBootstrapTokens: pluginApiMocks.clearDeviceBootstrapTokens, + definePluginEntry: vi.fn((entry) => entry), issueDeviceBootstrapToken: pluginApiMocks.issueDeviceBootstrapToken, listDevicePairing: vi.fn(async () => ({ pending: [] })), renderQrPngBase64: pluginApiMocks.renderQrPngBase64, @@ -79,6 +78,12 @@ function createCommandContext(params?: Partial): PluginCom commandBody: "/pair qr", args: "qr", config: {}, + requestConversationBinding: async () => ({ + status: "error", + message: "unsupported", + }), + detachConversationBinding: async () => ({ removed: false }), + getCurrentConversationBinding: async () => null, ...params, }; } diff --git a/extensions/device-pair/index.ts b/extensions/device-pair/index.ts index 3b3e1500823..06b3df1fa6c 100644 --- a/extensions/device-pair/index.ts +++ b/extensions/device-pair/index.ts @@ -697,8 +697,9 @@ export default definePluginEntry({ setupCode = encodeSetupCode(payload); } finally { if (qrFilePath) { - await rm(path.dirname(qrFilePath), { recursive: true, force: true }).catch(() => { - }); + await rm(path.dirname(qrFilePath), { recursive: true, force: true }).catch( + () => {}, + ); } } } @@ -768,6 +769,7 @@ export default definePluginEntry({ )})`, ); } + } return { text: formatSetupReply(payload, authLabel), }; diff --git a/extensions/device-pair/notify.ts b/extensions/device-pair/notify.ts index 7de2a8536e2..e5d07174c2a 100644 --- a/extensions/device-pair/notify.ts +++ b/extensions/device-pair/notify.ts @@ -263,7 +263,7 @@ async function notifySubscriber(params: { try { await send(params.subscriber.to, params.text, { ...(params.subscriber.accountId ? { accountId: params.subscriber.accountId } : {}), - ...(params.subscriber.messageThreadId != null + ...(typeof params.subscriber.messageThreadId === "number" ? { messageThreadId: params.subscriber.messageThreadId } : {}), }); diff --git a/src/plugins/commands.ts b/src/plugins/commands.ts index 8137ebbed1b..85d73d7cabc 100644 --- a/src/plugins/commands.ts +++ b/src/plugins/commands.ts @@ -322,7 +322,7 @@ function resolveBindingConversationFromCommand(params: { from?: string; to?: string; accountId?: string; - messageThreadId?: number; + messageThreadId?: string | number; }): { channel: string; accountId: string;