diff --git a/.npmignore b/.npmignore index fcc490ae35d..c7c73e07366 100644 --- a/.npmignore +++ b/.npmignore @@ -1,2 +1,3 @@ **/node_modules/ +**/.runtime-deps-*/ docs/.generated/ diff --git a/extensions/acpx/src/runtime.test.ts b/extensions/acpx/src/runtime.test.ts index 3515d712aa6..d4ce4d7d49e 100644 --- a/extensions/acpx/src/runtime.test.ts +++ b/extensions/acpx/src/runtime.test.ts @@ -2,8 +2,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { pathToFileURL } from "node:url"; +import { runAcpRuntimeAdapterContract } from "openclaw/plugin-sdk/testing"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; -import { runAcpRuntimeAdapterContract } from "../../../src/acp/runtime/adapter-contract.testkit.js"; import { resolveAcpxPluginConfig } from "./config.js"; import { AcpxRuntime, decodeAcpxRuntimeHandleState } from "./runtime.js"; import { diff --git a/extensions/acpx/src/service.test.ts b/extensions/acpx/src/service.test.ts index e348dde100e..1610642f2b7 100644 --- a/extensions/acpx/src/service.test.ts +++ b/extensions/acpx/src/service.test.ts @@ -1,10 +1,10 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; -import { AcpRuntimeError } from "../../../src/acp/runtime/errors.js"; +import { AcpRuntimeError } from "openclaw/plugin-sdk/acp-runtime"; import { __testing, getAcpRuntimeBackend, requireAcpRuntimeBackend, -} from "../../../src/acp/runtime/registry.js"; +} from "openclaw/plugin-sdk/acp-runtime"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import type { AcpRuntime, OpenClawPluginServiceContext } from "../runtime-api.js"; import { ACPX_BUNDLED_BIN, ACPX_PINNED_VERSION } from "./config.js"; import { createAcpxRuntimeService } from "./service.js"; diff --git a/extensions/bluebubbles/src/conversation-route.test.ts b/extensions/bluebubbles/src/conversation-route.test.ts index d4c91e94526..7465faab3e3 100644 --- a/extensions/bluebubbles/src/conversation-route.test.ts +++ b/extensions/bluebubbles/src/conversation-route.test.ts @@ -1,9 +1,9 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { __testing as sessionBindingTesting, registerSessionBindingAdapter, -} from "../../../src/infra/outbound/session-binding-service.js"; +} from "openclaw/plugin-sdk/conversation-runtime"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { resolveBlueBubblesConversationRoute } from "./conversation-route.js"; const baseCfg = { diff --git a/extensions/bluebubbles/src/monitor.webhook-route.test.ts b/extensions/bluebubbles/src/monitor.webhook-route.test.ts index cb30d9edb01..1d24d9264bb 100644 --- a/extensions/bluebubbles/src/monitor.webhook-route.test.ts +++ b/extensions/bluebubbles/src/monitor.webhook-route.test.ts @@ -1,6 +1,6 @@ +import { createEmptyPluginRegistry } from "openclaw/plugin-sdk/testing"; +import { setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it } from "vitest"; -import { createEmptyPluginRegistry } from "../../../src/plugins/registry.js"; -import { setActivePluginRegistry } from "../../../src/plugins/runtime.js"; import type { WebhookTarget } from "./monitor-shared.js"; import { registerBlueBubblesWebhookTarget } from "./monitor.js"; import type { OpenClawConfig } from "./runtime-api.js"; diff --git a/extensions/bluebubbles/src/setup-surface.test.ts b/extensions/bluebubbles/src/setup-surface.test.ts index 31029b211e5..ad8ca4ba30b 100644 --- a/extensions/bluebubbles/src/setup-surface.test.ts +++ b/extensions/bluebubbles/src/setup-surface.test.ts @@ -1,6 +1,6 @@ import { adaptScopedAccountAccessor } from "openclaw/plugin-sdk/channel-config-helpers"; +import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/routing"; import { describe, expect, it, vi } from "vitest"; -import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js"; import { createSetupWizardAdapter, createTestWizardPrompter, diff --git a/extensions/browser/src/browser-tool.test.ts b/extensions/browser/src/browser-tool.test.ts index c9d48521a33..5f4ed3b414a 100644 --- a/extensions/browser/src/browser-tool.test.ts +++ b/extensions/browser/src/browser-tool.test.ts @@ -115,7 +115,7 @@ vi.mock("../../../src/agents/tools/gateway.js", () => gatewayMocks); const configMocks = vi.hoisted(() => ({ loadConfig: vi.fn(() => ({ browser: {} })), })); -vi.mock("../../../src/config/config.js", () => configMocks); +vi.mock("openclaw/plugin-sdk/config-runtime", () => configMocks); const sessionTabRegistryMocks = vi.hoisted(() => ({ trackSessionBrowserTab: vi.fn(), diff --git a/extensions/browser/src/browser/proxy-files.test.ts b/extensions/browser/src/browser/proxy-files.test.ts index 796cc87ce12..1522162df29 100644 --- a/extensions/browser/src/browser/proxy-files.test.ts +++ b/extensions/browser/src/browser/proxy-files.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { MEDIA_MAX_BYTES } from "openclaw/plugin-sdk/media-runtime"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { MEDIA_MAX_BYTES } from "../../../../src/media/store.js"; import { createTempHomeEnv, type TempHomeEnv } from "../../test-support.js"; import { persistBrowserProxyFiles } from "./proxy-files.js"; diff --git a/extensions/browser/src/cli/browser-cli.test-support.ts b/extensions/browser/src/cli/browser-cli.test-support.ts index c8be1c6b285..14c5a1eb0ab 100644 --- a/extensions/browser/src/cli/browser-cli.test-support.ts +++ b/extensions/browser/src/cli/browser-cli.test-support.ts @@ -1,5 +1,5 @@ import { Command } from "commander"; -import type { GatewayRpcOpts } from "../../../../src/cli/gateway-rpc.js"; +import type { GatewayRpcOpts } from "openclaw/plugin-sdk/browser-support"; import { createCliRuntimeCapture } from "../../test-support.js"; import type { CliRuntimeCapture } from "../../test-support.js"; diff --git a/extensions/browser/src/gateway/browser-request.profile-from-body.test.ts b/extensions/browser/src/gateway/browser-request.profile-from-body.test.ts index fa31f96d4a7..8b2fef26fb7 100644 --- a/extensions/browser/src/gateway/browser-request.profile-from-body.test.ts +++ b/extensions/browser/src/gateway/browser-request.profile-from-body.test.ts @@ -8,7 +8,7 @@ const { loadConfigMock, isNodeCommandAllowedMock, resolveNodeCommandAllowlistMoc }), ); -vi.mock("../../../../src/config/config.js", () => ({ +vi.mock("openclaw/plugin-sdk/config-runtime", () => ({ loadConfig: loadConfigMock, })); diff --git a/extensions/browser/test-support.ts b/extensions/browser/test-support.ts index 9d4c8dd65c6..8343f6b996c 100644 --- a/extensions/browser/test-support.ts +++ b/extensions/browser/test-support.ts @@ -1,10 +1,10 @@ -export { isLiveTestEnabled } from "../../src/agents/live-test-helpers.js"; export { createCliRuntimeCapture, + isLiveTestEnabled, type CliMockOutputRuntime, type CliRuntimeCapture, -} from "../../src/cli/test-runtime-capture.js"; -export type { OpenClawConfig } from "openclaw/plugin-sdk/browser-support"; +} from "openclaw/plugin-sdk/testing"; +export { type OpenClawConfig } from "openclaw/plugin-sdk/browser-support"; export { expectGeneratedTokenPersistedToGatewayAuth } from "../../test/helpers/plugins/auth-token-assertions.ts"; export { withEnv, withEnvAsync } from "../../test/helpers/plugins/env.ts"; export { withFetchPreconnect, type FetchMock } from "../../test/helpers/plugins/fetch-mock.ts"; diff --git a/extensions/deepgram/audio.live.test.ts b/extensions/deepgram/audio.live.test.ts index bdfba2fca5e..ce97fe732a0 100644 --- a/extensions/deepgram/audio.live.test.ts +++ b/extensions/deepgram/audio.live.test.ts @@ -1,5 +1,5 @@ +import { isLiveTestEnabled } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { isLiveTestEnabled } from "../../src/agents/live-test-helpers.js"; import { transcribeDeepgramAudio } from "./audio.js"; const DEEPGRAM_KEY = process.env.DEEPGRAM_API_KEY ?? ""; diff --git a/extensions/deepgram/audio.test.ts b/extensions/deepgram/audio.test.ts index 9367eef2c43..d97777b336a 100644 --- a/extensions/deepgram/audio.test.ts +++ b/extensions/deepgram/audio.test.ts @@ -1,9 +1,9 @@ -import { describe, expect, it } from "vitest"; import { createAuthCaptureJsonFetch, createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "../../src/media-understanding/audio.test-helpers.js"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { transcribeDeepgramAudio } from "./audio.js"; installPinnedHostnameTestHooks(); diff --git a/extensions/deepseek/index.test.ts b/extensions/deepseek/index.test.ts index 92bc661ed0a..58bb56969f4 100644 --- a/extensions/deepseek/index.test.ts +++ b/extensions/deepseek/index.test.ts @@ -1,5 +1,5 @@ +import { resolveProviderPluginChoice } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { resolveProviderPluginChoice } from "../../src/plugins/provider-wizard.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; import deepseekPlugin from "./index.js"; diff --git a/extensions/discord/src/account-inspect.test.ts b/extensions/discord/src/account-inspect.test.ts index eda0b6cc0e0..f474d5af861 100644 --- a/extensions/discord/src/account-inspect.test.ts +++ b/extensions/discord/src/account-inspect.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { inspectDiscordAccount } from "./account-inspect.js"; function asConfig(value: unknown): OpenClawConfig { diff --git a/extensions/discord/src/actions/handle-action.test.ts b/extensions/discord/src/actions/handle-action.test.ts index 33b2228234e..5fec28815d5 100644 --- a/extensions/discord/src/actions/handle-action.test.ts +++ b/extensions/discord/src/actions/handle-action.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; const runtimeModule = await import("./runtime.js"); const handleDiscordActionMock = vi diff --git a/extensions/discord/src/actions/runtime.moderation.authz.test.ts b/extensions/discord/src/actions/runtime.moderation.authz.test.ts index 66d2a4ba9d8..bf787552b66 100644 --- a/extensions/discord/src/actions/runtime.moderation.authz.test.ts +++ b/extensions/discord/src/actions/runtime.moderation.authz.test.ts @@ -1,6 +1,6 @@ import { PermissionFlagsBits } from "discord-api-types/v10"; +import type { DiscordActionConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { DiscordActionConfig } from "../../../../src/config/types.discord.js"; import { discordModerationActionRuntime, handleDiscordModerationAction, diff --git a/extensions/discord/src/actions/runtime.presence.test.ts b/extensions/discord/src/actions/runtime.presence.test.ts index 7cc118150de..e2ae809c1ea 100644 --- a/extensions/discord/src/actions/runtime.presence.test.ts +++ b/extensions/discord/src/actions/runtime.presence.test.ts @@ -1,7 +1,7 @@ import type { GatewayPlugin } from "@buape/carbon/gateway"; +import type { DiscordActionConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { ActionGate } from "openclaw/plugin-sdk/discord-core"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { ActionGate } from "../../../../src/agents/tools/common.js"; -import type { DiscordActionConfig } from "../../../../src/config/types.discord.js"; import { clearGateways, registerGateway } from "../monitor/gateway-registry.js"; import { handleDiscordPresenceAction } from "./runtime.presence.js"; diff --git a/extensions/discord/src/actions/runtime.test.ts b/extensions/discord/src/actions/runtime.test.ts index 2dcf8491505..8eeff67dc14 100644 --- a/extensions/discord/src/actions/runtime.test.ts +++ b/extensions/discord/src/actions/runtime.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { DiscordActionConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import type { DiscordActionConfig } from "../../../../src/config/types.discord.js"; import { discordGuildActionRuntime, handleDiscordGuildAction } from "./runtime.guild.js"; import { handleDiscordAction } from "./runtime.js"; import { diff --git a/extensions/discord/src/audit.test.ts b/extensions/discord/src/audit.test.ts index 35bfb60829b..0446cca2ece 100644 --- a/extensions/discord/src/audit.test.ts +++ b/extensions/discord/src/audit.test.ts @@ -28,7 +28,7 @@ describe("discord audit", () => { }, }, }, - } as unknown as import("../../../src/config/config.js").OpenClawConfig; + } as unknown as import("openclaw/plugin-sdk/config-runtime").OpenClawConfig; const collected = collectDiscordAuditChannelIds({ cfg, @@ -74,7 +74,7 @@ describe("discord audit", () => { }, }, }, - } as unknown as import("../../../src/config/config.js").OpenClawConfig; + } as unknown as import("openclaw/plugin-sdk/config-runtime").OpenClawConfig; const collected = collectDiscordAuditChannelIds({ cfg, accountId: "default" }); expect(collected.channelIds).toEqual(["111"]); @@ -99,7 +99,7 @@ describe("discord audit", () => { }, }, }, - } as unknown as import("../../../src/config/config.js").OpenClawConfig; + } as unknown as import("openclaw/plugin-sdk/config-runtime").OpenClawConfig; const collected = collectDiscordAuditChannelIds({ cfg, accountId: "default" }); expect(collected.channelIds).toEqual([]); @@ -128,7 +128,7 @@ describe("discord audit", () => { }, }, }, - } as unknown as import("../../../src/config/config.js").OpenClawConfig; + } as unknown as import("openclaw/plugin-sdk/config-runtime").OpenClawConfig; const collected = collectDiscordAuditChannelIds({ cfg, accountId: "default" }); expect(collected.channelIds).toEqual(["111"]); diff --git a/extensions/discord/src/channel.test.ts b/extensions/discord/src/channel.test.ts index 75515740b67..3170248f71d 100644 --- a/extensions/discord/src/channel.test.ts +++ b/extensions/discord/src/channel.test.ts @@ -1,9 +1,9 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { PluginApprovalRequest, PluginApprovalResolved, -} from "../../../src/infra/plugin-approvals.js"; -import type { PluginRuntime } from "../../../src/plugins/runtime/types.js"; +} from "openclaw/plugin-sdk/infra-runtime"; +import type { PluginRuntime } from "openclaw/plugin-sdk/testing"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { createStartAccountContext } from "../../../test/helpers/plugins/start-account-context.js"; import type { ResolvedDiscordAccount } from "./accounts.js"; import type { OpenClawConfig } from "./runtime-api.js"; diff --git a/extensions/discord/src/client.test.ts b/extensions/discord/src/client.test.ts index 416fa7c903a..717be98d44c 100644 --- a/extensions/discord/src/client.test.ts +++ b/extensions/discord/src/client.test.ts @@ -1,6 +1,6 @@ import type { RequestClient } from "@buape/carbon"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { createDiscordRestClient } from "./client.js"; describe("createDiscordRestClient", () => { diff --git a/extensions/discord/src/directory-live.test.ts b/extensions/discord/src/directory-live.test.ts index 36f1f821795..adc4898dff2 100644 --- a/extensions/discord/src/directory-live.test.ts +++ b/extensions/discord/src/directory-live.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { DirectoryConfigParams } from "openclaw/plugin-sdk/directory-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import type { DirectoryConfigParams } from "../../../src/plugin-sdk/directory-runtime.js"; import { listDiscordDirectoryGroupsLive, listDiscordDirectoryPeersLive } from "./directory-live.js"; function makeParams(overrides: Partial = {}): DirectoryConfigParams { diff --git a/extensions/discord/src/exec-approvals.test.ts b/extensions/discord/src/exec-approvals.test.ts index dd3a86ce59d..57bbc3e2f7a 100644 --- a/extensions/discord/src/exec-approvals.test.ts +++ b/extensions/discord/src/exec-approvals.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { getDiscordExecApprovalApprovers, isDiscordExecApprovalApprover, diff --git a/extensions/discord/src/monitor.test.ts b/extensions/discord/src/monitor.test.ts index ba62bfe6370..18c57c32c37 100644 --- a/extensions/discord/src/monitor.test.ts +++ b/extensions/discord/src/monitor.test.ts @@ -168,7 +168,7 @@ describe("DiscordMessageListener", () => { warn: vi.fn(), error: vi.fn(), } as unknown as ReturnType< - typeof import("../../../src/logging/subsystem.js").createSubsystemLogger + typeof import("openclaw/plugin-sdk/logging-core").createSubsystemLogger >; const handler = vi.fn(async () => { throw new Error("boom"); @@ -191,7 +191,7 @@ describe("DiscordMessageListener", () => { warn: vi.fn(), error: vi.fn(), } as unknown as ReturnType< - typeof import("../../../src/logging/subsystem.js").createSubsystemLogger + typeof import("openclaw/plugin-sdk/logging-core").createSubsystemLogger >; const listener = new DiscordMessageListener(handler, logger); @@ -990,9 +990,9 @@ function makeReactionListenerParams(overrides?: { guildEntries?: Record; }) { return { - cfg: {} as ReturnType, + cfg: {} as ReturnType, accountId: "acc-1", - runtime: {} as import("../../../src/runtime.js").RuntimeEnv, + runtime: {} as import("openclaw/plugin-sdk/runtime-env").RuntimeEnv, botUserId: overrides?.botUserId ?? "bot-1", dmEnabled: overrides?.dmEnabled ?? true, groupDmEnabled: overrides?.groupDmEnabled ?? true, @@ -1008,7 +1008,7 @@ function makeReactionListenerParams(overrides?: { error: vi.fn(), debug: vi.fn(), } as unknown as ReturnType< - typeof import("../../../src/logging/subsystem.js").createSubsystemLogger + typeof import("openclaw/plugin-sdk/logging-core").createSubsystemLogger >, }; } diff --git a/extensions/discord/src/monitor/acp-bind-here.integration.test.ts b/extensions/discord/src/monitor/acp-bind-here.integration.test.ts index 438425addb4..c87d376332c 100644 --- a/extensions/discord/src/monitor/acp-bind-here.integration.test.ts +++ b/extensions/discord/src/monitor/acp-bind-here.integration.test.ts @@ -11,19 +11,19 @@ vi.mock("openclaw/plugin-sdk/config-runtime", async (importOriginal) => { }; }); -import { __testing as acpManagerTesting } from "../../../../src/acp/control-plane/manager.js"; -import { handleAcpCommand } from "../../../../src/auto-reply/reply/commands-acp.js"; -import { buildCommandTestParams } from "../../../../src/auto-reply/reply/commands-spawn.test-harness.js"; -import { setDefaultChannelPluginRegistryForTests } from "../../../../src/commands/channel-test-helpers.js"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import * as gatewayCall from "../../../../src/gateway/call.js"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { __testing as sessionBindingTesting, getSessionBindingService, registerSessionBindingAdapter, type SessionBindingBindInput, type SessionBindingRecord, -} from "../../../../src/infra/outbound/session-binding-service.js"; +} from "openclaw/plugin-sdk/conversation-runtime"; +import { __testing as acpManagerTesting } from "openclaw/plugin-sdk/testing"; +import { handleAcpCommand } from "openclaw/plugin-sdk/testing"; +import { buildCommandTestParams } from "openclaw/plugin-sdk/testing"; +import { setDefaultChannelPluginRegistryForTests } from "openclaw/plugin-sdk/testing"; +import * as gatewayCall from "openclaw/plugin-sdk/testing"; import { preflightDiscordMessage } from "./message-handler.preflight.js"; import { createDiscordMessage, diff --git a/extensions/discord/src/monitor/auto-presence.test.ts b/extensions/discord/src/monitor/auto-presence.test.ts index 96fa7187fe5..1c55aaafd05 100644 --- a/extensions/discord/src/monitor/auto-presence.test.ts +++ b/extensions/discord/src/monitor/auto-presence.test.ts @@ -1,5 +1,5 @@ +import type { AuthProfileStore } from "openclaw/plugin-sdk/provider-auth"; import { describe, expect, it, vi } from "vitest"; -import type { AuthProfileStore } from "../../../../src/agents/auth-profiles.js"; import { createDiscordAutoPresenceController, resolveDiscordAutoPresenceDecision, diff --git a/extensions/discord/src/monitor/exec-approvals.test.ts b/extensions/discord/src/monitor/exec-approvals.test.ts index 02928381cb6..d960dd91ea2 100644 --- a/extensions/discord/src/monitor/exec-approvals.test.ts +++ b/extensions/discord/src/monitor/exec-approvals.test.ts @@ -3,9 +3,9 @@ import os from "node:os"; import path from "node:path"; import type { ButtonInteraction, ComponentData } from "@buape/carbon"; import { Routes } from "discord-api-types/v10"; +import { clearSessionStoreCacheForTest } from "openclaw/plugin-sdk/config-runtime"; +import type { DiscordExecApprovalConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { clearSessionStoreCacheForTest } from "../../../../src/config/sessions.js"; -import type { DiscordExecApprovalConfig } from "../../../../src/config/types.discord.js"; const STORE_PATH = path.join(os.tmpdir(), "openclaw-exec-approvals-test.json"); diff --git a/extensions/discord/src/monitor/message-handler.inbound-context.test.ts b/extensions/discord/src/monitor/message-handler.inbound-context.test.ts index 1e7ef0c0e16..b442d27aa5f 100644 --- a/extensions/discord/src/monitor/message-handler.inbound-context.test.ts +++ b/extensions/discord/src/monitor/message-handler.inbound-context.test.ts @@ -1,6 +1,6 @@ +import { finalizeInboundContext } from "openclaw/plugin-sdk/reply-runtime"; +import { expectChannelInboundContextContract as expectInboundContextContract } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { finalizeInboundContext } from "../../../../src/auto-reply/reply/inbound-context.js"; -import { expectChannelInboundContextContract as expectInboundContextContract } from "../../../../src/channels/plugins/contracts/suites.js"; import { buildDiscordInboundAccessContext } from "./inbound-context.js"; import { buildFinalizedDiscordDirectInboundContext } from "./inbound-context.test-helpers.js"; diff --git a/extensions/discord/src/monitor/message-handler.preflight.acp-bindings.test.ts b/extensions/discord/src/monitor/message-handler.preflight.acp-bindings.test.ts index 86795ae0507..66c0764b64e 100644 --- a/extensions/discord/src/monitor/message-handler.preflight.acp-bindings.test.ts +++ b/extensions/discord/src/monitor/message-handler.preflight.acp-bindings.test.ts @@ -16,7 +16,7 @@ vi.mock("../../../../src/channels/plugins/binding-routing.js", async (importOrig ); }); -import { __testing as sessionBindingTesting } from "../../../../src/infra/outbound/session-binding-service.js"; +import { __testing as sessionBindingTesting } from "openclaw/plugin-sdk/conversation-runtime"; import { preflightDiscordMessage } from "./message-handler.preflight.js"; import { createDiscordMessage, @@ -148,7 +148,7 @@ function createBasePreflightParams(overrides?: Record) { discordConfig: { allowBots: true, } as NonNullable< - import("../../../../src/config/config.js").OpenClawConfig["channels"] + import("openclaw/plugin-sdk/config-runtime").OpenClawConfig["channels"] >["discord"], data: createGuildEvent({ channelId: CHANNEL_ID, @@ -162,7 +162,7 @@ function createBasePreflightParams(overrides?: Record) { discordConfig: { allowBots: true, } as NonNullable< - import("../../../../src/config/config.js").OpenClawConfig["channels"] + import("openclaw/plugin-sdk/config-runtime").OpenClawConfig["channels"] >["discord"], ...overrides, } satisfies Parameters[0]; diff --git a/extensions/discord/src/monitor/message-handler.preflight.test.ts b/extensions/discord/src/monitor/message-handler.preflight.test.ts index 94646739d79..19bca048a1b 100644 --- a/extensions/discord/src/monitor/message-handler.preflight.test.ts +++ b/extensions/discord/src/monitor/message-handler.preflight.test.ts @@ -9,7 +9,7 @@ vi.mock("./preflight-audio.runtime.js", () => ({ import { __testing as sessionBindingTesting, registerSessionBindingAdapter, -} from "../../../../src/infra/outbound/session-binding-service.js"; +} from "openclaw/plugin-sdk/conversation-runtime"; import { createDiscordMessage, createDiscordPreflightArgs, @@ -37,9 +37,7 @@ beforeAll(async () => { }); function createThreadBinding( - overrides?: Partial< - import("../../../../src/infra/outbound/session-binding-service.js").SessionBindingRecord - >, + overrides?: Partial, ) { return { bindingId: "default:thread-1", @@ -60,11 +58,11 @@ function createThreadBinding( webhookToken: "tok-1", }, ...overrides, - } satisfies import("../../../../src/infra/outbound/session-binding-service.js").SessionBindingRecord; + } satisfies import("openclaw/plugin-sdk/conversation-runtime").SessionBindingRecord; } function createPreflightArgs(params: { - cfg: import("../../../../src/config/config.js").OpenClawConfig; + cfg: import("openclaw/plugin-sdk/config-runtime").OpenClawConfig; discordConfig: DiscordConfig; data: DiscordMessageEvent; client: DiscordClient; @@ -114,7 +112,7 @@ async function runThreadBoundPreflight(params: { threadId: string; parentId: string; message: import("@buape/carbon").Message; - threadBinding: import("../../../../src/infra/outbound/session-binding-service.js").SessionBindingRecord; + threadBinding: import("openclaw/plugin-sdk/conversation-runtime").SessionBindingRecord; discordConfig: DiscordConfig; registerBindingAdapter?: boolean; }) { @@ -156,7 +154,7 @@ async function runGuildPreflight(params: { guildId: string; message: import("@buape/carbon").Message; discordConfig: DiscordConfig; - cfg?: import("../../../../src/config/config.js").OpenClawConfig; + cfg?: import("openclaw/plugin-sdk/config-runtime").OpenClawConfig; guildEntries?: Parameters[0]["guildEntries"]; includeGuildObject?: boolean; }) { @@ -473,7 +471,7 @@ describe("preflightDiscordMessage", () => { createPreflightArgs({ cfg: { ...DEFAULT_PREFLIGHT_CFG, - } as import("../../../../src/config/config.js").OpenClawConfig, + } as import("openclaw/plugin-sdk/config-runtime").OpenClawConfig, discordConfig: { allowBots: true, } as DiscordConfig, @@ -732,7 +730,7 @@ describe("preflightDiscordMessage", () => { mentionPatterns: ["openclaw"], }, }, - } as import("../../../../src/config/config.js").OpenClawConfig, + } as import("openclaw/plugin-sdk/config-runtime").OpenClawConfig, discordConfig: {} as DiscordConfig, data: createGuildEvent({ channelId, diff --git a/extensions/discord/src/monitor/message-handler.process.test.ts b/extensions/discord/src/monitor/message-handler.process.test.ts index 021214b88f7..474b740fda2 100644 --- a/extensions/discord/src/monitor/message-handler.process.test.ts +++ b/extensions/discord/src/monitor/message-handler.process.test.ts @@ -1,5 +1,5 @@ +import { DEFAULT_EMOJIS } from "openclaw/plugin-sdk/channel-feedback"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { DEFAULT_EMOJIS } from "../../../../src/channels/status-reactions.js"; const sendMocks = vi.hoisted(() => ({ reactMessageDiscord: vi.fn< diff --git a/extensions/discord/src/monitor/message-utils.test.ts b/extensions/discord/src/monitor/message-utils.test.ts index 41425a0f128..29fb60bf940 100644 --- a/extensions/discord/src/monitor/message-utils.test.ts +++ b/extensions/discord/src/monitor/message-utils.test.ts @@ -5,19 +5,19 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const fetchRemoteMedia = vi.fn(); const saveMediaBuffer = vi.fn(); -vi.mock("../../../../src/media/fetch.js", () => ({ +vi.mock("openclaw/plugin-sdk/media-runtime", () => ({ fetchRemoteMedia: (...args: unknown[]) => fetchRemoteMedia(...args), })); -vi.mock("../../../../src/media/store.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/media-runtime", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, saveMediaBuffer: (...args: unknown[]) => saveMediaBuffer(...args), }; }); -vi.mock("../../../../src/globals.js", () => ({ +vi.mock("openclaw/plugin-sdk/runtime-env", () => ({ logVerbose: () => {}, })); diff --git a/extensions/discord/src/monitor/model-picker.test.ts b/extensions/discord/src/monitor/model-picker.test.ts index 4a4b75a9429..5bd1f7cb882 100644 --- a/extensions/discord/src/monitor/model-picker.test.ts +++ b/extensions/discord/src/monitor/model-picker.test.ts @@ -1,8 +1,8 @@ import { serializePayload } from "@buape/carbon"; import { ComponentType } from "discord-api-types/v10"; +import * as modelsCommandModule from "openclaw/plugin-sdk/command-auth"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it, vi } from "vitest"; -import * as modelsCommandModule from "../../../../src/auto-reply/reply/commands-models.js"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; import { DISCORD_CUSTOM_ID_MAX_CHARS, DISCORD_MODEL_PICKER_MODEL_PAGE_SIZE, diff --git a/extensions/discord/src/monitor/monitor.agent-components.test.ts b/extensions/discord/src/monitor/monitor.agent-components.test.ts index 34c60257db4..38a9efa7f9b 100644 --- a/extensions/discord/src/monitor/monitor.agent-components.test.ts +++ b/extensions/discord/src/monitor/monitor.agent-components.test.ts @@ -4,8 +4,8 @@ import type { DiscordAccountConfig } from "openclaw/plugin-sdk/config-runtime"; import * as conversationRuntime from "openclaw/plugin-sdk/conversation-runtime"; import { buildAgentSessionKey } from "openclaw/plugin-sdk/routing"; import * as securityRuntime from "openclaw/plugin-sdk/security-runtime"; +import { peekSystemEvents, resetSystemEventsForTest } from "openclaw/plugin-sdk/testing"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { peekSystemEvents, resetSystemEventsForTest } from "../../../../src/infra/system-events.ts"; import { expectPairingReplyText } from "../../../../test/helpers/pairing-reply.js"; import { readAllowFromStoreMock, diff --git a/extensions/discord/src/monitor/monitor.test.ts b/extensions/discord/src/monitor/monitor.test.ts index c81b94c2617..580d889c9b7 100644 --- a/extensions/discord/src/monitor/monitor.test.ts +++ b/extensions/discord/src/monitor/monitor.test.ts @@ -87,11 +87,8 @@ vi.mock("openclaw/plugin-sdk/reply-runtime", async (importOriginal) => { // agent-components.ts can bind the core dispatcher via reply-runtime re-exports, // so keep this direct mock to avoid hitting real embedded-agent dispatch in tests. -vi.mock("../../../../src/auto-reply/reply/provider-dispatcher.js", async (importOriginal) => { - const actual = - await importOriginal< - typeof import("../../../../src/auto-reply/reply/provider-dispatcher.js") - >(); +vi.mock("openclaw/plugin-sdk/reply-runtime", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, dispatchReplyWithBufferedBlockDispatcher: (...args: unknown[]) => dispatchReplyMock(...args), 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 f475697cdf5..de37ff47c48 100644 --- a/extensions/discord/src/monitor/native-command.commands-allowfrom.test.ts +++ b/extensions/discord/src/monitor/native-command.commands-allowfrom.test.ts @@ -1,10 +1,10 @@ import { ChannelType } from "discord-api-types/v10"; +import type { NativeCommandSpec } from "openclaw/plugin-sdk/command-auth"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { DiscordAccountConfig } from "openclaw/plugin-sdk/config-runtime"; +import * as pluginCommandsModule from "openclaw/plugin-sdk/plugin-runtime"; +import * as dispatcherModule from "openclaw/plugin-sdk/reply-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { NativeCommandSpec } from "../../../../src/auto-reply/commands-registry.js"; -import * as dispatcherModule from "../../../../src/auto-reply/reply/provider-dispatcher.js"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import type { DiscordAccountConfig } from "../../../../src/config/types.discord.js"; -import * as pluginCommandsModule from "../../../../src/plugins/commands.js"; import { __testing as nativeCommandTesting, createDiscordNativeCommand } from "./native-command.js"; import { createMockCommandInteraction, diff --git a/extensions/discord/src/monitor/native-command.model-picker.test.ts b/extensions/discord/src/monitor/native-command.model-picker.test.ts index 5ac9113f94b..190383b8b34 100644 --- a/extensions/discord/src/monitor/native-command.model-picker.test.ts +++ b/extensions/discord/src/monitor/native-command.model-picker.test.ts @@ -1,15 +1,12 @@ import { ChannelType } from "discord-api-types/v10"; +import * as commandRegistryModule from "openclaw/plugin-sdk/command-auth"; +import type { ChatCommandDefinition, CommandArgsParsing } from "openclaw/plugin-sdk/command-auth"; +import type { ModelsProviderData } from "openclaw/plugin-sdk/command-auth"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import * as dispatcherModule from "openclaw/plugin-sdk/reply-runtime"; +import * as globalsModule from "openclaw/plugin-sdk/runtime-env"; +import * as timeoutModule from "openclaw/plugin-sdk/runtime-env"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import * as commandRegistryModule from "../../../../src/auto-reply/commands-registry.js"; -import type { - ChatCommandDefinition, - CommandArgsParsing, -} from "../../../../src/auto-reply/commands-registry.types.js"; -import type { ModelsProviderData } from "../../../../src/auto-reply/reply/commands-models.js"; -import * as dispatcherModule from "../../../../src/auto-reply/reply/provider-dispatcher.js"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import * as globalsModule from "../../../../src/globals.js"; -import * as timeoutModule from "../../../../src/utils/with-timeout.js"; import * as modelPickerPreferencesModule from "./model-picker-preferences.js"; import * as modelPickerModule from "./model-picker.js"; import { createModelsProviderData as createBaseModelsProviderData } from "./model-picker.test-utils.js"; diff --git a/extensions/discord/src/monitor/native-command.options.test.ts b/extensions/discord/src/monitor/native-command.options.test.ts index 32d3bf5320d..900b0f97c02 100644 --- a/extensions/discord/src/monitor/native-command.options.test.ts +++ b/extensions/discord/src/monitor/native-command.options.test.ts @@ -1,6 +1,6 @@ import { ChannelType } from "discord-api-types/v10"; +import type { OpenClawConfig, loadConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig, loadConfig } from "../../../../src/config/config.js"; const { logVerboseMock } = vi.hoisted(() => ({ logVerboseMock: vi.fn(), @@ -26,7 +26,7 @@ vi.mock("openclaw/plugin-sdk/runtime-env", async () => { }; }); -let listNativeCommandSpecs: typeof import("../../../../src/auto-reply/commands-registry.js").listNativeCommandSpecs; +let listNativeCommandSpecs: typeof import("openclaw/plugin-sdk/command-auth").listNativeCommandSpecs; let createDiscordNativeCommand: typeof import("./native-command.js").createDiscordNativeCommand; let createNoopThreadBindingManager: typeof import("./thread-bindings.js").createNoopThreadBindingManager; @@ -97,7 +97,7 @@ function readChoices(option: CommandOption | undefined): unknown[] | undefined { describe("createDiscordNativeCommand option wiring", () => { beforeAll(async () => { - ({ listNativeCommandSpecs } = await import("../../../../src/auto-reply/commands-registry.js")); + ({ listNativeCommandSpecs } = await import("openclaw/plugin-sdk/command-auth")); ({ createDiscordNativeCommand } = await import("./native-command.js")); ({ createNoopThreadBindingManager } = await import("./thread-bindings.js")); }); diff --git a/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts b/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts index c0a2969f0f6..8435fb0fc50 100644 --- a/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts +++ b/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts @@ -1,9 +1,9 @@ import { ChannelType } from "discord-api-types/v10"; +import type { NativeCommandSpec } from "openclaw/plugin-sdk/command-auth"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { clearPluginCommands, registerPluginCommand } from "openclaw/plugin-sdk/plugin-runtime"; +import { setDefaultChannelPluginRegistryForTests } from "openclaw/plugin-sdk/testing"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { NativeCommandSpec } from "../../../../src/auto-reply/commands-registry.js"; -import { setDefaultChannelPluginRegistryForTests } from "../../../../src/commands/channel-test-helpers.js"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import { clearPluginCommands, registerPluginCommand } from "../../../../src/plugins/commands.js"; import { createMockCommandInteraction, type MockCommandInteraction, diff --git a/extensions/discord/src/monitor/native-command.think-autocomplete.test.ts b/extensions/discord/src/monitor/native-command.think-autocomplete.test.ts index 20e2126ef52..58cfb613734 100644 --- a/extensions/discord/src/monitor/native-command.think-autocomplete.test.ts +++ b/extensions/discord/src/monitor/native-command.think-autocomplete.test.ts @@ -2,13 +2,13 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { ChannelType, type AutocompleteInteraction } from "@buape/carbon"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { findCommandByNativeName, resolveCommandArgChoices, -} from "../../../../src/auto-reply/commands-registry.js"; -import type { OpenClawConfig, loadConfig } from "../../../../src/config/config.js"; -import { clearSessionStoreCacheForTest } from "../../../../src/config/sessions/store.js"; +} from "openclaw/plugin-sdk/command-auth"; +import type { OpenClawConfig, loadConfig } from "openclaw/plugin-sdk/config-runtime"; +import { clearSessionStoreCacheForTest } from "openclaw/plugin-sdk/config-runtime"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createNoopThreadBindingManager } from "./thread-bindings.js"; const ensureConfiguredBindingRouteReadyMock = vi.hoisted(() => diff --git a/extensions/discord/src/monitor/provider.allowlist.test.ts b/extensions/discord/src/monitor/provider.allowlist.test.ts index 4fc96b6dd15..f72df9022aa 100644 --- a/extensions/discord/src/monitor/provider.allowlist.test.ts +++ b/extensions/discord/src/monitor/provider.allowlist.test.ts @@ -1,5 +1,5 @@ +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { RuntimeEnv } from "../../../../src/runtime.js"; import { createNonExitingTypedRuntimeEnv } from "../../../../test/helpers/plugins/runtime-env.js"; import * as resolveChannelsModule from "../resolve-channels.js"; import * as resolveUsersModule from "../resolve-users.js"; diff --git a/extensions/discord/src/monitor/provider.lifecycle.test.ts b/extensions/discord/src/monitor/provider.lifecycle.test.ts index acb872385a4..978d71d6cf7 100644 --- a/extensions/discord/src/monitor/provider.lifecycle.test.ts +++ b/extensions/discord/src/monitor/provider.lifecycle.test.ts @@ -1,7 +1,7 @@ import { EventEmitter } from "node:events"; import type { GatewayPlugin } from "@buape/carbon/gateway"; +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { beforeEach, describe, expect, it, vi, type Mock } from "vitest"; -import type { RuntimeEnv } from "../../../../src/runtime.js"; import type { WaitForDiscordGatewayStopParams } from "../monitor.gateway.js"; import type { MutableDiscordGateway } from "./gateway-handle.js"; import type { DiscordGatewayEvent } from "./gateway-supervisor.js"; diff --git a/extensions/discord/src/monitor/provider.test.ts b/extensions/discord/src/monitor/provider.test.ts index 5a0e3ebc8d4..d5cdc783209 100644 --- a/extensions/discord/src/monitor/provider.test.ts +++ b/extensions/discord/src/monitor/provider.test.ts @@ -1,8 +1,8 @@ import { EventEmitter } from "node:events"; import { RateLimitError } from "@buape/carbon"; +import { AcpRuntimeError } from "openclaw/plugin-sdk/acp-runtime"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { AcpRuntimeError } from "../../../../src/acp/runtime/errors.js"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; import { baseConfig, baseRuntime, @@ -605,7 +605,7 @@ describe("monitorDiscordProvider", () => { it("registers plugin commands from the real registry as native Discord commands", async () => { const { clearPluginCommands, getPluginCommandSpecs, registerPluginCommand } = - await import("../../../../src/plugins/commands.js"); + await import("openclaw/plugin-sdk/plugin-runtime"); clearPluginCommands(); listNativeCommandSpecsForConfigMock.mockReturnValue([ { name: "status", description: "Status", acceptsArgs: false }, diff --git a/extensions/discord/src/monitor/reply-delivery.test.ts b/extensions/discord/src/monitor/reply-delivery.test.ts index 764995974a3..10d3be0f807 100644 --- a/extensions/discord/src/monitor/reply-delivery.test.ts +++ b/extensions/discord/src/monitor/reply-delivery.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import type { RuntimeEnv } from "../../../../src/runtime.js"; import { __testing as threadBindingTesting, createThreadBindingManager, diff --git a/extensions/discord/src/monitor/route-resolution.test.ts b/extensions/discord/src/monitor/route-resolution.test.ts index 6fab967cde0..7f181e59d61 100644 --- a/extensions/discord/src/monitor/route-resolution.test.ts +++ b/extensions/discord/src/monitor/route-resolution.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { ResolvedAgentRoute } from "openclaw/plugin-sdk/routing"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import type { ResolvedAgentRoute } from "../../../../src/routing/resolve-route.js"; import { buildDiscordRoutePeer, resolveDiscordBoundConversationRoute, diff --git a/extensions/discord/src/monitor/thread-bindings.discord-api.test.ts b/extensions/discord/src/monitor/thread-bindings.discord-api.test.ts index b89058b173f..bafb421e04c 100644 --- a/extensions/discord/src/monitor/thread-bindings.discord-api.test.ts +++ b/extensions/discord/src/monitor/thread-bindings.discord-api.test.ts @@ -1,6 +1,6 @@ import { ChannelType } from "discord-api-types/v10"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; import * as discordClientModule from "../client.js"; import * as discordSendModule from "../send.js"; import type { ThreadBindingRecord } from "./thread-bindings.types.js"; diff --git a/extensions/discord/src/monitor/thread-bindings.lifecycle.test.ts b/extensions/discord/src/monitor/thread-bindings.lifecycle.test.ts index 0fa0721178f..16d9dcd367f 100644 --- a/extensions/discord/src/monitor/thread-bindings.lifecycle.test.ts +++ b/extensions/discord/src/monitor/thread-bindings.lifecycle.test.ts @@ -2,13 +2,13 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { ChannelType } from "discord-api-types/v10"; -import { beforeEach, describe, expect, it, vi } from "vitest"; import { clearRuntimeConfigSnapshot, setRuntimeConfigSnapshot, type OpenClawConfig, -} from "../../../../src/config/config.js"; -import { getSessionBindingService } from "../../../../src/infra/outbound/session-binding-service.js"; +} from "openclaw/plugin-sdk/config-runtime"; +import { getSessionBindingService } from "openclaw/plugin-sdk/conversation-runtime"; +import { beforeEach, describe, expect, it, vi } from "vitest"; const hoisted = vi.hoisted(() => { const sendMessageDiscord = vi.fn(async (_to: string, _text: string, _opts?: unknown) => ({})); diff --git a/extensions/discord/src/monitor/threading.auto-thread.test.ts b/extensions/discord/src/monitor/threading.auto-thread.test.ts index 201d2c88a25..3ebd27d9254 100644 --- a/extensions/discord/src/monitor/threading.auto-thread.test.ts +++ b/extensions/discord/src/monitor/threading.auto-thread.test.ts @@ -1,6 +1,6 @@ import { ChannelType } from "@buape/carbon"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; type MaybeCreateDiscordAutoThreadFn = typeof import("./threading.js").maybeCreateDiscordAutoThread; const { generateThreadTitleMock } = vi.hoisted(() => ({ diff --git a/extensions/discord/src/send.components.test.ts b/extensions/discord/src/send.components.test.ts index 259af185cf5..2b5a7ad5cbf 100644 --- a/extensions/discord/src/send.components.test.ts +++ b/extensions/discord/src/send.components.test.ts @@ -4,9 +4,9 @@ import { makeDiscordRest } from "./send.test-harness.js"; const loadConfigMock = vi.hoisted(() => vi.fn(() => ({ session: { dmScope: "main" } }))); -vi.mock("../../../src/config/config.js", async () => { - const actual = await vi.importActual( - "../../../src/config/config.js", +vi.mock("openclaw/plugin-sdk/config-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/config-runtime", ); return { ...actual, diff --git a/extensions/discord/src/send.webhook-activity.test.ts b/extensions/discord/src/send.webhook-activity.test.ts index ba528a5cd53..2082793c44a 100644 --- a/extensions/discord/src/send.webhook-activity.test.ts +++ b/extensions/discord/src/send.webhook-activity.test.ts @@ -3,8 +3,8 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const recordChannelActivityMock = vi.hoisted(() => vi.fn()); const loadConfigMock = vi.hoisted(() => vi.fn(() => ({ channels: { discord: {} } }))); -vi.mock("../../../src/config/config.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/config-runtime", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, loadConfig: () => loadConfigMock(), diff --git a/extensions/discord/src/targets.test.ts b/extensions/discord/src/targets.test.ts index 29f02d6e73d..d06b15064a6 100644 --- a/extensions/discord/src/targets.test.ts +++ b/extensions/discord/src/targets.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import * as directoryLive from "./directory-live.js"; import { resolveDiscordGroupRequireMention, diff --git a/extensions/discord/src/token.test.ts b/extensions/discord/src/token.test.ts index 4c40fc93805..9490b9f6040 100644 --- a/extensions/discord/src/token.test.ts +++ b/extensions/discord/src/token.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { resolveDiscordToken } from "./token.js"; describe("resolveDiscordToken", () => { diff --git a/extensions/feishu/src/bot.broadcast.test.ts b/extensions/feishu/src/bot.broadcast.test.ts index 2e1acdaac66..db3abb6ffbb 100644 --- a/extensions/feishu/src/bot.broadcast.test.ts +++ b/extensions/feishu/src/bot.broadcast.test.ts @@ -1,5 +1,5 @@ +import type { EnvelopeFormatOptions } from "openclaw/plugin-sdk/channel-inbound"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { EnvelopeFormatOptions } from "../../../src/auto-reply/envelope.js"; import { createPluginRuntimeMock } from "../../../test/helpers/plugins/plugin-runtime-mock.js"; import { createRuntimeEnv } from "../../../test/helpers/plugins/runtime-env.js"; import type { ClawdbotConfig, PluginRuntime } from "../runtime-api.js"; diff --git a/extensions/feishu/src/bot.test.ts b/extensions/feishu/src/bot.test.ts index a9ac447c06c..c93284bfc38 100644 --- a/extensions/feishu/src/bot.test.ts +++ b/extensions/feishu/src/bot.test.ts @@ -1,6 +1,6 @@ import type * as ConversationRuntime from "openclaw/plugin-sdk/conversation-runtime"; +import type { ResolvedAgentRoute } from "openclaw/plugin-sdk/routing"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { ResolvedAgentRoute } from "../../../src/routing/resolve-route.js"; import { createPluginRuntimeMock } from "../../../test/helpers/plugins/plugin-runtime-mock.js"; import { createRuntimeEnv } from "../../../test/helpers/plugins/runtime-env.js"; import type { ClawdbotConfig, PluginRuntime, RuntimeEnv } from "../runtime-api.js"; @@ -259,7 +259,7 @@ vi.mock("openclaw/plugin-sdk/conversation-runtime", async (importOriginal) => { }; }); -vi.mock("../../../src/infra/outbound/session-binding-service.js", () => ({ +vi.mock("openclaw/plugin-sdk/conversation-runtime", () => ({ getSessionBindingService: () => ({ resolveByConversation: mockResolveBoundConversation, touch: mockTouchBinding, diff --git a/extensions/feishu/src/media.test.ts b/extensions/feishu/src/media.test.ts index aaf476311ea..845beeb4e47 100644 --- a/extensions/feishu/src/media.test.ts +++ b/extensions/feishu/src/media.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { resolvePreferredOpenClawTmpDir } from "../../../src/infra/tmp-openclaw-dir.js"; import type { ClawdbotConfig } from "../runtime-api.js"; const createFeishuClientMock = vi.hoisted(() => vi.fn()); diff --git a/extensions/feishu/src/monitor.bot-menu.test.ts b/extensions/feishu/src/monitor.bot-menu.test.ts index eca1dac76aa..74ad907d6e8 100644 --- a/extensions/feishu/src/monitor.bot-menu.test.ts +++ b/extensions/feishu/src/monitor.bot-menu.test.ts @@ -1,9 +1,9 @@ -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { hasControlCommand } from "../../../src/auto-reply/command-detection.js"; +import { hasControlCommand } from "openclaw/plugin-sdk/command-auth"; import { createInboundDebouncer, resolveInboundDebounceMs, -} from "../../../src/auto-reply/inbound-debounce.js"; +} from "openclaw/plugin-sdk/reply-runtime"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createPluginRuntimeMock } from "../../../test/helpers/plugins/plugin-runtime-mock.js"; import type { ClawdbotConfig, RuntimeEnv } from "../runtime-api.js"; import { monitorSingleAccount } from "./monitor.account.js"; diff --git a/extensions/feishu/src/monitor.reaction.test.ts b/extensions/feishu/src/monitor.reaction.test.ts index 17608a27731..2876bf9b8f8 100644 --- a/extensions/feishu/src/monitor.reaction.test.ts +++ b/extensions/feishu/src/monitor.reaction.test.ts @@ -1,9 +1,9 @@ -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { hasControlCommand } from "../../../src/auto-reply/command-detection.js"; +import { hasControlCommand } from "openclaw/plugin-sdk/command-auth"; import { createInboundDebouncer, resolveInboundDebounceMs, -} from "../../../src/auto-reply/inbound-debounce.js"; +} from "openclaw/plugin-sdk/reply-runtime"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createPluginRuntimeMock } from "../../../test/helpers/plugins/plugin-runtime-mock.js"; import { createNonExitingTypedRuntimeEnv, diff --git a/extensions/feishu/src/thread-bindings.test.ts b/extensions/feishu/src/thread-bindings.test.ts index a118926df57..fa10730247b 100644 --- a/extensions/feishu/src/thread-bindings.test.ts +++ b/extensions/feishu/src/thread-bindings.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { getSessionBindingService } from "openclaw/plugin-sdk/conversation-runtime"; import { beforeEach, describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import { getSessionBindingService } from "../../../src/infra/outbound/session-binding-service.js"; import { __testing, createFeishuThreadBindingManager } from "./thread-bindings.js"; const baseCfg = { diff --git a/extensions/google/media-understanding-provider.video.test.ts b/extensions/google/media-understanding-provider.video.test.ts index 41742d8f5d7..a650e6680fc 100644 --- a/extensions/google/media-understanding-provider.video.test.ts +++ b/extensions/google/media-understanding-provider.video.test.ts @@ -1,5 +1,5 @@ +import * as ssrf from "openclaw/plugin-sdk/infra-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import * as ssrf from "../../src/infra/net/ssrf.js"; import { withFetchPreconnect } from "../../test/helpers/plugins/fetch-mock.js"; import { createRequestCaptureJsonFetch } from "../../test/helpers/plugins/media-understanding.js"; import { describeGeminiVideo } from "./media-understanding-provider.js"; diff --git a/extensions/googlechat/src/monitor.webhook-routing.test.ts b/extensions/googlechat/src/monitor.webhook-routing.test.ts index f0509c28254..9a32f3a0d49 100644 --- a/extensions/googlechat/src/monitor.webhook-routing.test.ts +++ b/extensions/googlechat/src/monitor.webhook-routing.test.ts @@ -1,8 +1,8 @@ import { EventEmitter } from "node:events"; import type { IncomingMessage } from "node:http"; +import { createEmptyPluginRegistry } from "openclaw/plugin-sdk/testing"; +import { setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createEmptyPluginRegistry } from "../../../src/plugins/registry.js"; -import { setActivePluginRegistry } from "../../../src/plugins/runtime.js"; import { createMockServerResponse } from "../../../test/helpers/plugins/mock-http-response.js"; import type { OpenClawConfig, PluginRuntime } from "../runtime-api.js"; import type { ResolvedGoogleChatAccount } from "./accounts.js"; diff --git a/extensions/imessage/src/conversation-route.test.ts b/extensions/imessage/src/conversation-route.test.ts index 1f9c4c9394f..779ad08a039 100644 --- a/extensions/imessage/src/conversation-route.test.ts +++ b/extensions/imessage/src/conversation-route.test.ts @@ -1,9 +1,9 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { __testing as sessionBindingTesting, registerSessionBindingAdapter, -} from "../../../src/infra/outbound/session-binding-service.js"; +} from "openclaw/plugin-sdk/conversation-runtime"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { resolveIMessageConversationRoute } from "./conversation-route.js"; const baseCfg = { diff --git a/extensions/imessage/src/monitor.gating.test.ts b/extensions/imessage/src/monitor.gating.test.ts index 2e564cc30cf..d9ea18b6cd7 100644 --- a/extensions/imessage/src/monitor.gating.test.ts +++ b/extensions/imessage/src/monitor.gating.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { buildIMessageInboundContext, resolveIMessageInboundDecision, diff --git a/extensions/imessage/src/monitor/deliver.test.ts b/extensions/imessage/src/monitor/deliver.test.ts index 8574911d383..0d20482c3a8 100644 --- a/extensions/imessage/src/monitor/deliver.test.ts +++ b/extensions/imessage/src/monitor/deliver.test.ts @@ -1,5 +1,5 @@ +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { RuntimeEnv } from "../../../../src/runtime.js"; const sendMessageIMessageMock = vi.hoisted(() => vi.fn().mockImplementation(async (_to: string, message: string) => ({ diff --git a/extensions/imessage/src/monitor/inbound-processing.test.ts b/extensions/imessage/src/monitor/inbound-processing.test.ts index 2012353037c..a86b55ea11f 100644 --- a/extensions/imessage/src/monitor/inbound-processing.test.ts +++ b/extensions/imessage/src/monitor/inbound-processing.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { sanitizeTerminalText } from "openclaw/plugin-sdk/testing"; import { describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import { sanitizeTerminalText } from "../../../../src/terminal/safe-text.js"; import { describeIMessageEchoDropLog, resolveIMessageInboundDecision, diff --git a/extensions/imessage/src/monitor/self-chat-dedupe.test.ts b/extensions/imessage/src/monitor/self-chat-dedupe.test.ts index 7668026818a..54bf5b4bb41 100644 --- a/extensions/imessage/src/monitor/self-chat-dedupe.test.ts +++ b/extensions/imessage/src/monitor/self-chat-dedupe.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; import { createSentMessageCache } from "./echo-cache.js"; import { resolveIMessageInboundDecision } from "./inbound-processing.js"; import { createSelfChatCache } from "./self-chat-cache.js"; diff --git a/extensions/imessage/src/targets.test.ts b/extensions/imessage/src/targets.test.ts index d13c9142527..b981dc3632a 100644 --- a/extensions/imessage/src/targets.test.ts +++ b/extensions/imessage/src/targets.test.ts @@ -1,6 +1,6 @@ +import * as processRuntime from "openclaw/plugin-sdk/process-runtime"; +import * as setupRuntime from "openclaw/plugin-sdk/setup"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import * as processRuntime from "../../../src/plugin-sdk/process-runtime.js"; -import * as setupRuntime from "../../../src/plugin-sdk/setup.js"; import * as clientModule from "./client.js"; import { resolveIMessageGroupRequireMention, diff --git a/extensions/irc/src/policy.test.ts b/extensions/irc/src/policy.test.ts index 4136466ca79..2101eed25a2 100644 --- a/extensions/irc/src/policy.test.ts +++ b/extensions/irc/src/policy.test.ts @@ -1,5 +1,5 @@ +import { resolveChannelGroupPolicy } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import { resolveChannelGroupPolicy } from "../../../src/config/group-policy.js"; import { resolveIrcGroupAccessGate, resolveIrcGroupMatch, diff --git a/extensions/kilocode/onboard.test.ts b/extensions/kilocode/onboard.test.ts index f0ffa4795fe..702e9ad5887 100644 --- a/extensions/kilocode/onboard.test.ts +++ b/extensions/kilocode/onboard.test.ts @@ -1,17 +1,20 @@ import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; -import { describe, expect, it } from "vitest"; -import { resolveApiKeyForProvider, resolveEnvApiKey } from "../../src/agents/model-auth.js"; -import type { OpenClawConfig } from "../../src/config/config.js"; -import { resolveAgentModelPrimaryValue } from "../../src/config/model-input.js"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { buildKilocodeModelDefinition, KILOCODE_DEFAULT_CONTEXT_WINDOW, KILOCODE_DEFAULT_MAX_TOKENS, KILOCODE_DEFAULT_COST, KILOCODE_DEFAULT_MODEL_ID, -} from "../../src/plugin-sdk/kilocode.js"; +} from "openclaw/plugin-sdk/kilocode"; +import { + resolveApiKeyForProvider, + resolveEnvApiKey, +} from "openclaw/plugin-sdk/provider-auth-runtime"; +import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; +import { describe, expect, it } from "vitest"; import { captureEnv } from "../../test/helpers/plugins/env.js"; import { applyKilocodeProviderConfig, diff --git a/extensions/line/src/bot-message-context.test.ts b/extensions/line/src/bot-message-context.test.ts index f6ac0c25740..cdcb8f1bf0d 100644 --- a/extensions/line/src/bot-message-context.test.ts +++ b/extensions/line/src/bot-message-context.test.ts @@ -4,9 +4,9 @@ import path from "node:path"; import type { MessageEvent, PostbackEvent } from "@line/bot-sdk"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { getSessionBindingService } from "openclaw/plugin-sdk/conversation-runtime"; +import { __testing as sessionBindingTesting } from "openclaw/plugin-sdk/conversation-runtime"; +import { setDefaultChannelPluginRegistryForTests } from "openclaw/plugin-sdk/testing"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { setDefaultChannelPluginRegistryForTests } from "../../../src/commands/channel-test-helpers.js"; -import { __testing as sessionBindingTesting } from "../../../src/infra/outbound/session-binding-service.js"; import { buildLineMessageContext, buildLinePostbackContext } from "./bot-message-context.js"; import { linePlugin } from "./channel.js"; import type { ResolvedLineAccount } from "./types.js"; diff --git a/extensions/matrix/src/matrix/client/file-sync-store.test.ts b/extensions/matrix/src/matrix/client/file-sync-store.test.ts index 5d064e30c0f..9247c074983 100644 --- a/extensions/matrix/src/matrix/client/file-sync-store.test.ts +++ b/extensions/matrix/src/matrix/client/file-sync-store.test.ts @@ -2,8 +2,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import type { ISyncResponse } from "matrix-js-sdk"; +import * as jsonFiles from "openclaw/plugin-sdk/infra-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; -import * as jsonFiles from "../../../../../src/infra/json-files.js"; import { FileBackedMatrixSyncStore } from "./file-sync-store.js"; function createSyncResponse(nextBatch: string): ISyncResponse { diff --git a/extensions/matrix/src/matrix/monitor/handler.test.ts b/extensions/matrix/src/matrix/monitor/handler.test.ts index ffa18c328fd..7be3c23ffa8 100644 --- a/extensions/matrix/src/matrix/monitor/handler.test.ts +++ b/extensions/matrix/src/matrix/monitor/handler.test.ts @@ -1,8 +1,8 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; import { __testing as sessionBindingTesting, registerSessionBindingAdapter, -} from "../../../../../src/infra/outbound/session-binding-service.js"; +} from "openclaw/plugin-sdk/conversation-runtime"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { installMatrixMonitorTestRuntime } from "../../test-runtime.js"; import { createMatrixRoomMessageHandler } from "./handler.js"; import { diff --git a/extensions/matrix/src/matrix/thread-bindings.test.ts b/extensions/matrix/src/matrix/thread-bindings.test.ts index 34a5f29d545..53bd2bff72c 100644 --- a/extensions/matrix/src/matrix/thread-bindings.test.ts +++ b/extensions/matrix/src/matrix/thread-bindings.test.ts @@ -1,11 +1,8 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import { getSessionBindingService, __testing } from "openclaw/plugin-sdk/conversation-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { - getSessionBindingService, - __testing, -} from "../../../../src/infra/outbound/session-binding-service.js"; import type { PluginRuntime } from "../../runtime-api.js"; const sendMessageMatrixMock = vi.hoisted(() => diff --git a/extensions/memory-core/src/cli.test.ts b/extensions/memory-core/src/cli.test.ts index eccf32cd929..4aeff68e399 100644 --- a/extensions/memory-core/src/cli.test.ts +++ b/extensions/memory-core/src/cli.test.ts @@ -2,13 +2,13 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { Command } from "commander"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { firstWrittenJsonArg, spyRuntimeErrors, spyRuntimeJson, spyRuntimeLogs, -} from "../../../src/cli/test-runtime-capture.js"; +} from "openclaw/plugin-sdk/testing"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const getMemorySearchManager = vi.hoisted(() => vi.fn()); const loadConfig = vi.hoisted(() => vi.fn(() => ({}))); diff --git a/extensions/microsoft-foundry/index.test.ts b/extensions/microsoft-foundry/index.test.ts index 588786af00b..079f41a99bb 100644 --- a/extensions/microsoft-foundry/index.test.ts +++ b/extensions/microsoft-foundry/index.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../src/config/types.openclaw.js"; import { createTestPluginApi } from "../../test/helpers/plugins/plugin-api.js"; import { getAccessTokenResultAsync } from "./cli.js"; import plugin from "./index.js"; diff --git a/extensions/microsoft/speech-provider.test.ts b/extensions/microsoft/speech-provider.test.ts index 1d6959460a5..e04e051885a 100644 --- a/extensions/microsoft/speech-provider.test.ts +++ b/extensions/microsoft/speech-provider.test.ts @@ -1,6 +1,6 @@ import { writeFileSync } from "node:fs"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../src/config/config.js"; import { buildMicrosoftSpeechProvider, isCjkDominant, diff --git a/extensions/minimax/onboard.test.ts b/extensions/minimax/onboard.test.ts index 95384149b87..b2cb0e8f224 100644 --- a/extensions/minimax/onboard.test.ts +++ b/extensions/minimax/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, -} from "../../src/config/model-input.js"; +} from "openclaw/plugin-sdk/provider-onboard"; +import { describe, expect, it } from "vitest"; import { createConfigWithFallbacks, createLegacyProviderConfig, diff --git a/extensions/mistral/media-understanding-provider.test.ts b/extensions/mistral/media-understanding-provider.test.ts index 938cf04f164..de7012f6af8 100644 --- a/extensions/mistral/media-understanding-provider.test.ts +++ b/extensions/mistral/media-understanding-provider.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "../../src/media-understanding/audio.test-helpers.js"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { mistralMediaUnderstandingProvider } from "./media-understanding-provider.js"; installPinnedHostnameTestHooks(); diff --git a/extensions/mistral/onboard.test.ts b/extensions/mistral/onboard.test.ts index 24fee3e8006..1e48bc4caef 100644 --- a/extensions/mistral/onboard.test.ts +++ b/extensions/mistral/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, -} from "../../src/config/model-input.js"; +} from "openclaw/plugin-sdk/provider-onboard"; +import { describe, expect, it } from "vitest"; import { createConfigWithFallbacks, createLegacyProviderConfig, diff --git a/extensions/moonshot/media-understanding-provider.test.ts b/extensions/moonshot/media-understanding-provider.test.ts index 1f650f5f947..08fa433419b 100644 --- a/extensions/moonshot/media-understanding-provider.test.ts +++ b/extensions/moonshot/media-understanding-provider.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "../../src/media-understanding/audio.test-helpers.js"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { describeMoonshotVideo } from "./media-understanding-provider.js"; installPinnedHostnameTestHooks(); diff --git a/extensions/msteams/src/messenger.test.ts b/extensions/msteams/src/messenger.test.ts index 85f3b0ae042..7ad7049e7db 100644 --- a/extensions/msteams/src/messenger.test.ts +++ b/extensions/msteams/src/messenger.test.ts @@ -17,7 +17,7 @@ vi.mock("./graph-upload.js", async () => { }; }); -import { resolvePreferredOpenClawTmpDir } from "../../../src/infra/tmp-openclaw-dir.js"; +import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path"; import { type MSTeamsAdapter, type MSTeamsRenderedMessage, diff --git a/extensions/ollama/src/provider-models.test.ts b/extensions/ollama/src/provider-models.test.ts index 11dd985b460..14600dff6d3 100644 --- a/extensions/ollama/src/provider-models.test.ts +++ b/extensions/ollama/src/provider-models.test.ts @@ -1,5 +1,5 @@ +import { jsonResponse, requestBodyText, requestUrl } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { jsonResponse, requestBodyText, requestUrl } from "../../../src/test-helpers/http.js"; import { enrichOllamaModelsWithContext, resolveOllamaApiBase, diff --git a/extensions/ollama/src/setup.test.ts b/extensions/ollama/src/setup.test.ts index 73a38f969e9..6668ff91eeb 100644 --- a/extensions/ollama/src/setup.test.ts +++ b/extensions/ollama/src/setup.test.ts @@ -1,7 +1,7 @@ +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; +import type { WizardPrompter } from "openclaw/plugin-sdk/setup"; +import { jsonResponse, requestBodyText, requestUrl } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { RuntimeEnv } from "../../../src/runtime.js"; -import { jsonResponse, requestBodyText, requestUrl } from "../../../src/test-helpers/http.js"; -import type { WizardPrompter } from "../../../src/wizard/prompts.js"; import { configureOllamaNonInteractive, ensureOllamaModelPulled, diff --git a/extensions/openai/index.test.ts b/extensions/openai/index.test.ts index bc57932eaae..ced0ec5a5e5 100644 --- a/extensions/openai/index.test.ts +++ b/extensions/openai/index.test.ts @@ -4,12 +4,12 @@ import path from "node:path"; import { getModel } from "@mariozechner/pi-ai"; import { AuthStorage, ModelRegistry } from "@mariozechner/pi-coding-agent"; import OpenAI from "openai"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { loadConfig } from "openclaw/plugin-sdk/config-runtime"; +import { encodePngRgba, fillPixel } from "openclaw/plugin-sdk/media-runtime"; import * as providerAuth from "openclaw/plugin-sdk/provider-auth-runtime"; +import type { ResolvedTtsConfig } from "openclaw/plugin-sdk/speech-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../src/config/config.js"; -import { loadConfig } from "../../src/config/config.js"; -import { encodePngRgba, fillPixel } from "../../src/media/png-encode.js"; -import type { ResolvedTtsConfig } from "../../src/tts/tts.js"; import { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/openai/media-understanding-provider.test.ts b/extensions/openai/media-understanding-provider.test.ts index 1808b2b1888..8b397bb8c61 100644 --- a/extensions/openai/media-understanding-provider.test.ts +++ b/extensions/openai/media-understanding-provider.test.ts @@ -1,9 +1,9 @@ -import { describe, expect, it } from "vitest"; import { createAuthCaptureJsonFetch, createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "../../src/media-understanding/audio.test-helpers.js"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { transcribeOpenAiAudio } from "./media-understanding-provider.js"; installPinnedHostnameTestHooks(); diff --git a/extensions/opencode-go/onboard.test.ts b/extensions/opencode-go/onboard.test.ts index ee02c748562..ff2e3237812 100644 --- a/extensions/opencode-go/onboard.test.ts +++ b/extensions/opencode-go/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, -} from "../../src/config/model-input.js"; +} from "openclaw/plugin-sdk/provider-onboard"; +import { describe, expect, it } from "vitest"; import { createConfigWithFallbacks, EXPECTED_FALLBACKS, diff --git a/extensions/opencode/onboard.test.ts b/extensions/opencode/onboard.test.ts index 07c6ba7d4a9..4bceb1b642f 100644 --- a/extensions/opencode/onboard.test.ts +++ b/extensions/opencode/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, -} from "../../src/config/model-input.js"; +} from "openclaw/plugin-sdk/provider-onboard"; +import { describe, expect, it } from "vitest"; import { createConfigWithFallbacks, EXPECTED_FALLBACKS, diff --git a/extensions/openrouter/onboard.test.ts b/extensions/openrouter/onboard.test.ts index b5a5574dec9..9e30ac63951 100644 --- a/extensions/openrouter/onboard.test.ts +++ b/extensions/openrouter/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, -} from "../../src/config/model-input.js"; +} from "openclaw/plugin-sdk/provider-onboard"; +import { describe, expect, it } from "vitest"; import { createConfigWithFallbacks, EXPECTED_FALLBACKS, diff --git a/extensions/openshell/src/backend.e2e.test.ts b/extensions/openshell/src/backend.e2e.test.ts index 91a3916eea7..e35886817cd 100644 --- a/extensions/openshell/src/backend.e2e.test.ts +++ b/extensions/openshell/src/backend.e2e.test.ts @@ -3,8 +3,8 @@ import fs from "node:fs/promises"; import net from "node:net"; import os from "node:os"; import path from "node:path"; +import { createSandboxTestContext } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { createSandboxTestContext } from "../../../src/agents/sandbox/test-fixtures.js"; import { createSandboxBrowserConfig, createSandboxPruneConfig, diff --git a/extensions/openshell/src/openshell-core.test.ts b/extensions/openshell/src/openshell-core.test.ts index cee3c6d33ec..fccc362c51f 100644 --- a/extensions/openshell/src/openshell-core.test.ts +++ b/extensions/openshell/src/openshell-core.test.ts @@ -2,8 +2,8 @@ import fsSync from "node:fs"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import { createSandboxTestContext } from "openclaw/plugin-sdk/testing"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { createSandboxTestContext } from "../../../src/agents/sandbox/test-fixtures.js"; import type { OpenShellSandboxBackend } from "./backend.js"; import { buildExecRemoteCommand, diff --git a/extensions/signal/src/monitor.tool-result.autostart.test.ts b/extensions/signal/src/monitor.tool-result.autostart.test.ts index 413d657fe65..0b0e57093ee 100644 --- a/extensions/signal/src/monitor.tool-result.autostart.test.ts +++ b/extensions/signal/src/monitor.tool-result.autostart.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import type { SignalDaemonExitEvent } from "./daemon.js"; import { createSignalToolResultConfig, diff --git a/extensions/signal/src/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts b/extensions/signal/src/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts index bba38d4a680..a1d78779cd5 100644 --- a/extensions/signal/src/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts +++ b/extensions/signal/src/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts @@ -1,7 +1,7 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { resolveAgentRoute } from "openclaw/plugin-sdk/routing"; import { normalizeE164 } from "openclaw/plugin-sdk/text-runtime"; import { describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { expectPairingReplyText } from "../../../test/helpers/pairing-reply.js"; import { createSignalToolResultConfig, 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 e89cfa8c026..6687eaccc82 100644 --- a/extensions/signal/src/monitor/event-handler.inbound-context.test.ts +++ b/extensions/signal/src/monitor/event-handler.inbound-context.test.ts @@ -1,6 +1,6 @@ +import type { MsgContext } from "openclaw/plugin-sdk/reply-runtime"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { MsgContext } from "../../../../src/auto-reply/templating.js"; -let expectInboundContextContract: typeof import("../../../../src/channels/plugins/contracts/suites.js").expectChannelInboundContextContract; +let expectInboundContextContract: typeof import("openclaw/plugin-sdk/testing").expectChannelInboundContextContract; let createBaseSignalEventHandlerDeps: typeof import("./event-handler.test-harness.js").createBaseSignalEventHandlerDeps; let createSignalReceiveEvent: typeof import("./event-handler.test-harness.js").createSignalReceiveEvent; @@ -53,7 +53,7 @@ describe("signal createSignalEventHandler inbound context", () => { vi.useRealTimers(); vi.resetModules(); ({ expectChannelInboundContextContract: expectInboundContextContract } = - await import("../../../../src/channels/plugins/contracts/suites.js")); + await import("openclaw/plugin-sdk/testing")); ({ createBaseSignalEventHandlerDeps, createSignalReceiveEvent } = await import("./event-handler.test-harness.js")); ({ createSignalEventHandler } = await import("./event-handler.js")); diff --git a/extensions/signal/src/monitor/event-handler.mention-gating.test.ts b/extensions/signal/src/monitor/event-handler.mention-gating.test.ts index b459aa7f163..06e61add80e 100644 --- a/extensions/signal/src/monitor/event-handler.mention-gating.test.ts +++ b/extensions/signal/src/monitor/event-handler.mention-gating.test.ts @@ -1,7 +1,7 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { MsgContext } from "openclaw/plugin-sdk/reply-runtime"; +import { buildDispatchInboundCaptureMock } from "openclaw/plugin-sdk/testing"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { MsgContext } from "../../../../src/auto-reply/templating.js"; -import { buildDispatchInboundCaptureMock } from "../../../../src/channels/plugins/contracts/inbound-testkit.js"; -import type { OpenClawConfig } from "../../../../src/config/types.js"; type SignalMsgContext = Pick & { Body?: string; diff --git a/extensions/slack/src/action-runtime.test.ts b/extensions/slack/src/action-runtime.test.ts index 2ba67ea142a..5a66faa83bf 100644 --- a/extensions/slack/src/action-runtime.test.ts +++ b/extensions/slack/src/action-runtime.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { handleSlackAction, slackActionRuntime } from "./action-runtime.js"; import { parseSlackBlocksInput } from "./blocks-input.js"; diff --git a/extensions/slack/src/interactive-replies.test.ts b/extensions/slack/src/interactive-replies.test.ts index 272ef6733fd..4a4b75fb954 100644 --- a/extensions/slack/src/interactive-replies.test.ts +++ b/extensions/slack/src/interactive-replies.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { isSlackInteractiveRepliesEnabled } from "./interactive-replies.js"; describe("isSlackInteractiveRepliesEnabled", () => { diff --git a/extensions/slack/src/message-actions.test.ts b/extensions/slack/src/message-actions.test.ts index 1052075dea7..bd7fd66ed00 100644 --- a/extensions/slack/src/message-actions.test.ts +++ b/extensions/slack/src/message-actions.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { listSlackMessageActions } from "./message-actions.js"; describe("listSlackMessageActions", () => { diff --git a/extensions/slack/src/monitor.threading.missing-thread-ts.test.ts b/extensions/slack/src/monitor.threading.missing-thread-ts.test.ts index 7ae9efb1d58..b6d2d4b35ff 100644 --- a/extensions/slack/src/monitor.threading.missing-thread-ts.test.ts +++ b/extensions/slack/src/monitor.threading.missing-thread-ts.test.ts @@ -1,5 +1,5 @@ +import { resetInboundDedupe } from "openclaw/plugin-sdk/reply-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { resetInboundDedupe } from "../../../src/auto-reply/reply/inbound-dedupe.js"; import { flush, getSlackClient, diff --git a/extensions/slack/src/monitor.tool-result.test.ts b/extensions/slack/src/monitor.tool-result.test.ts index 2f2f5cdf77b..5d9000ed14b 100644 --- a/extensions/slack/src/monitor.tool-result.test.ts +++ b/extensions/slack/src/monitor.tool-result.test.ts @@ -13,7 +13,7 @@ import { stopSlackMonitor, } from "./monitor.test-helpers.js"; -let resetInboundDedupe: typeof import("../../../src/auto-reply/reply/inbound-dedupe.js").resetInboundDedupe; +let resetInboundDedupe: typeof import("openclaw/plugin-sdk/reply-runtime").resetInboundDedupe; let HISTORY_CONTEXT_MARKER: typeof import("../../../src/auto-reply/reply/history.js").HISTORY_CONTEXT_MARKER; let CURRENT_MESSAGE_MARKER: typeof import("../../../src/auto-reply/reply/mentions.js").CURRENT_MESSAGE_MARKER; let monitorSlackProvider: typeof import("./monitor.js").monitorSlackProvider; @@ -23,7 +23,7 @@ const { sendMock, replyMock, reactMock, upsertPairingRequestMock } = slackTestSt beforeEach(async () => { vi.resetModules(); - ({ resetInboundDedupe } = await import("../../../src/auto-reply/reply/inbound-dedupe.js")); + ({ resetInboundDedupe } = await import("openclaw/plugin-sdk/reply-runtime")); ({ HISTORY_CONTEXT_MARKER } = await import("../../../src/auto-reply/reply/history.js")); ({ CURRENT_MESSAGE_MARKER } = await import("../../../src/auto-reply/reply/mentions.js")); ({ monitorSlackProvider } = await import("./monitor.js")); diff --git a/extensions/slack/src/monitor/context.test.ts b/extensions/slack/src/monitor/context.test.ts index b3694315af1..ba6dae8c25d 100644 --- a/extensions/slack/src/monitor/context.test.ts +++ b/extensions/slack/src/monitor/context.test.ts @@ -1,7 +1,7 @@ import type { App } from "@slack/bolt"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import type { RuntimeEnv } from "../../../../src/runtime.js"; import { createSlackMonitorContext } from "./context.js"; function createTestContext() { diff --git a/extensions/slack/src/monitor/media.test.ts b/extensions/slack/src/monitor/media.test.ts index e434195c732..29ad5d395d2 100644 --- a/extensions/slack/src/monitor/media.test.ts +++ b/extensions/slack/src/monitor/media.test.ts @@ -1,9 +1,9 @@ +import * as ssrf from "openclaw/plugin-sdk/infra-runtime"; +import * as mediaFetch from "openclaw/plugin-sdk/media-runtime"; +import type { SavedMedia } from "openclaw/plugin-sdk/media-runtime"; +import * as mediaStore from "openclaw/plugin-sdk/media-runtime"; +import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/testing"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import * as ssrf from "../../../../src/infra/net/ssrf.js"; -import * as mediaFetch from "../../../../src/media/fetch.js"; -import type { SavedMedia } from "../../../../src/media/store.js"; -import * as mediaStore from "../../../../src/media/store.js"; -import { mockPinnedHostnameResolution } from "../../../../src/test-helpers/ssrf.js"; import { type FetchMock, withFetchPreconnect, diff --git a/extensions/slack/src/monitor/message-handler/prepare.test.ts b/extensions/slack/src/monitor/message-handler/prepare.test.ts index 7da7786a943..43cee31234d 100644 --- a/extensions/slack/src/monitor/message-handler/prepare.test.ts +++ b/extensions/slack/src/monitor/message-handler/prepare.test.ts @@ -2,11 +2,11 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import type { App } from "@slack/bolt"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { resolveAgentRoute } from "openclaw/plugin-sdk/routing"; +import { resolveThreadSessionKeys } from "openclaw/plugin-sdk/routing"; +import { expectChannelInboundContextContract as expectInboundContextContract } from "openclaw/plugin-sdk/testing"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; -import { expectChannelInboundContextContract as expectInboundContextContract } from "../../../../../src/channels/plugins/contracts/suites.js"; -import type { OpenClawConfig } from "../../../../../src/config/config.js"; -import { resolveAgentRoute } from "../../../../../src/routing/resolve-route.js"; -import { resolveThreadSessionKeys } from "../../../../../src/routing/session-key.js"; import type { ResolvedSlackAccount } from "../../accounts.js"; import type { SlackMessageEvent } from "../../types.js"; import type { SlackMonitorContext } from "../context.js"; diff --git a/extensions/slack/src/monitor/message-handler/prepare.thread-session-key.test.ts b/extensions/slack/src/monitor/message-handler/prepare.thread-session-key.test.ts index 406d96cc28a..2945efa5b5b 100644 --- a/extensions/slack/src/monitor/message-handler/prepare.thread-session-key.test.ts +++ b/extensions/slack/src/monitor/message-handler/prepare.thread-session-key.test.ts @@ -1,6 +1,6 @@ import type { App } from "@slack/bolt"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../../../src/config/config.js"; import type { SlackMessageEvent } from "../../types.js"; type PrepareSlackMessage = typeof import("./prepare.js").prepareSlackMessage; diff --git a/extensions/slack/src/monitor/monitor.test.ts b/extensions/slack/src/monitor/monitor.test.ts index 6741700ba5c..07eef4e51da 100644 --- a/extensions/slack/src/monitor/monitor.test.ts +++ b/extensions/slack/src/monitor/monitor.test.ts @@ -1,7 +1,7 @@ import type { App } from "@slack/bolt"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import type { RuntimeEnv } from "../../../../src/runtime.js"; import type { SlackMessageEvent } from "../types.js"; import { resolveSlackChannelConfig } from "./channel-config.js"; import { createSlackMonitorContext, normalizeSlackChannelType } from "./context.js"; diff --git a/extensions/slack/src/outbound-hooks.test.ts b/extensions/slack/src/outbound-hooks.test.ts index 8eccc072083..31bcaf9504e 100644 --- a/extensions/slack/src/outbound-hooks.test.ts +++ b/extensions/slack/src/outbound-hooks.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; const sendMessageSlackMock = vi.hoisted(() => vi.fn()); const getGlobalHookRunnerMock = vi.hoisted(() => vi.fn()); diff --git a/extensions/slack/src/outbound-payload.test.ts b/extensions/slack/src/outbound-payload.test.ts index bcc92c0d302..c7616e577dd 100644 --- a/extensions/slack/src/outbound-payload.test.ts +++ b/extensions/slack/src/outbound-payload.test.ts @@ -1,6 +1,6 @@ +import type { ReplyPayload } from "openclaw/plugin-sdk/reply-runtime"; +import { createSlackOutboundPayloadHarness } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import type { ReplyPayload } from "../../../src/auto-reply/types.js"; -import { createSlackOutboundPayloadHarness } from "../../../src/channels/plugins/contracts/suites.js"; function createHarness(params: { payload: ReplyPayload; diff --git a/extensions/slack/src/setup-surface.test.ts b/extensions/slack/src/setup-surface.test.ts index 0707099e338..ad4e880c503 100644 --- a/extensions/slack/src/setup-surface.test.ts +++ b/extensions/slack/src/setup-surface.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { createTestWizardPrompter, runSetupWizardFinalize, diff --git a/extensions/slack/src/targets.test.ts b/extensions/slack/src/targets.test.ts index 8ea720e6880..56b796e5ac3 100644 --- a/extensions/slack/src/targets.test.ts +++ b/extensions/slack/src/targets.test.ts @@ -1,5 +1,5 @@ +import { normalizeSlackMessagingTarget } from "openclaw/plugin-sdk/slack"; import { describe, expect, it } from "vitest"; -import { normalizeSlackMessagingTarget } from "../../../src/channels/plugins/normalize/slack.js"; import { parseSlackTarget, resolveSlackChannelId } from "./targets.js"; describe("parseSlackTarget", () => { diff --git a/extensions/slack/src/threading-tool-context.test.ts b/extensions/slack/src/threading-tool-context.test.ts index 793f3a2346f..caf9d7b873f 100644 --- a/extensions/slack/src/threading-tool-context.test.ts +++ b/extensions/slack/src/threading-tool-context.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { buildSlackThreadingToolContext } from "./threading-tool-context.js"; const emptyCfg = {} as OpenClawConfig; diff --git a/extensions/synology-chat/src/core.test.ts b/extensions/synology-chat/src/core.test.ts index 43efd2e6b5a..ba71581e66f 100644 --- a/extensions/synology-chat/src/core.test.ts +++ b/extensions/synology-chat/src/core.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { createPluginSetupWizardConfigure, createTestWizardPrompter, diff --git a/extensions/synthetic/api.ts b/extensions/synthetic/api.ts index 1bb680d7349..46d4257076a 100644 --- a/extensions/synthetic/api.ts +++ b/extensions/synthetic/api.ts @@ -2,6 +2,7 @@ export { applySyntheticConfig, applySyntheticProviderConfig } from "./onboard.js export { buildSyntheticModelDefinition, SYNTHETIC_BASE_URL, + SYNTHETIC_DEFAULT_MODEL_ID, SYNTHETIC_DEFAULT_MODEL_REF, SYNTHETIC_MODEL_CATALOG, } from "./models.js"; diff --git a/extensions/synthetic/onboard.test.ts b/extensions/synthetic/onboard.test.ts index befda764141..a2d55a5be2d 100644 --- a/extensions/synthetic/onboard.test.ts +++ b/extensions/synthetic/onboard.test.ts @@ -1,6 +1,6 @@ +import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; +import { SYNTHETIC_DEFAULT_MODEL_ID } from "openclaw/plugin-sdk/synthetic"; import { describe, expect, it } from "vitest"; -import { SYNTHETIC_DEFAULT_MODEL_ID } from "../../src/agents/synthetic-models.js"; -import { resolveAgentModelPrimaryValue } from "../../src/config/model-input.js"; import { createLegacyProviderConfig } from "../../test/helpers/plugins/onboard-config.js"; import { applySyntheticConfig, diff --git a/extensions/telegram/src/account-inspect.test.ts b/extensions/telegram/src/account-inspect.test.ts index f4f0e7ef6e9..abb578bfcca 100644 --- a/extensions/telegram/src/account-inspect.test.ts +++ b/extensions/telegram/src/account-inspect.test.ts @@ -1,8 +1,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { withEnv } from "../../../test/helpers/plugins/env.js"; import { inspectTelegramAccount } from "./account-inspect.js"; diff --git a/extensions/telegram/src/accounts.test.ts b/extensions/telegram/src/accounts.test.ts index b53d2088eed..fd8e5421c5f 100644 --- a/extensions/telegram/src/accounts.test.ts +++ b/extensions/telegram/src/accounts.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import * as subsystemModule from "openclaw/plugin-sdk/logging-core"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import * as subsystemModule from "../../../src/logging/subsystem.js"; import { withEnv } from "../../../test/helpers/plugins/env.js"; import { listTelegramAccountIds, diff --git a/extensions/telegram/src/action-runtime.test.ts b/extensions/telegram/src/action-runtime.test.ts index 797da2c5cbe..0387302eae0 100644 --- a/extensions/telegram/src/action-runtime.test.ts +++ b/extensions/telegram/src/action-runtime.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { captureEnv } from "../../../test/helpers/plugins/env.js"; import { handleTelegramAction, diff --git a/extensions/telegram/src/bot-message-context.dm-threads.test.ts b/extensions/telegram/src/bot-message-context.dm-threads.test.ts index 8826a96b77a..78e4d067cb4 100644 --- a/extensions/telegram/src/bot-message-context.dm-threads.test.ts +++ b/extensions/telegram/src/bot-message-context.dm-threads.test.ts @@ -2,7 +2,7 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; const { buildTelegramMessageContextForTest } = await import("./bot-message-context.test-harness.js"); const { clearRuntimeConfigSnapshot, setRuntimeConfigSnapshot } = - await import("../../../src/config/config.js"); + await import("openclaw/plugin-sdk/config-runtime"); beforeEach(() => { clearRuntimeConfigSnapshot(); diff --git a/extensions/telegram/src/bot-message-context.dm-topic-threadid.test.ts b/extensions/telegram/src/bot-message-context.dm-topic-threadid.test.ts index 0db56120483..4cc5b5c2499 100644 --- a/extensions/telegram/src/bot-message-context.dm-topic-threadid.test.ts +++ b/extensions/telegram/src/bot-message-context.dm-topic-threadid.test.ts @@ -6,7 +6,7 @@ import { } from "./bot-message-context.route-test-support.js"; let buildTelegramMessageContextForTest: typeof import("./bot-message-context.test-harness.js").buildTelegramMessageContextForTest; -let clearRuntimeConfigSnapshot: typeof import("../../../src/config/config.js").clearRuntimeConfigSnapshot; +let clearRuntimeConfigSnapshot: typeof import("openclaw/plugin-sdk/config-runtime").clearRuntimeConfigSnapshot; describe("buildTelegramMessageContext DM topic threadId in deliveryContext (#8891)", () => { async function buildCtx(params: { diff --git a/extensions/telegram/src/bot-message-context.named-account-dm.test.ts b/extensions/telegram/src/bot-message-context.named-account-dm.test.ts index 39de79de64e..d0ecfaa1e47 100644 --- a/extensions/telegram/src/bot-message-context.named-account-dm.test.ts +++ b/extensions/telegram/src/bot-message-context.named-account-dm.test.ts @@ -6,8 +6,8 @@ import { } from "./bot-message-context.route-test-support.js"; let buildTelegramMessageContextForTest: typeof import("./bot-message-context.test-harness.js").buildTelegramMessageContextForTest; -let clearRuntimeConfigSnapshot: typeof import("../../../src/config/config.js").clearRuntimeConfigSnapshot; -let setRuntimeConfigSnapshot: typeof import("../../../src/config/config.js").setRuntimeConfigSnapshot; +let clearRuntimeConfigSnapshot: typeof import("openclaw/plugin-sdk/config-runtime").clearRuntimeConfigSnapshot; +let setRuntimeConfigSnapshot: typeof import("openclaw/plugin-sdk/config-runtime").setRuntimeConfigSnapshot; describe("buildTelegramMessageContext named-account DM fallback", () => { const baseCfg = { diff --git a/extensions/telegram/src/bot-message-context.topic-agentid.test.ts b/extensions/telegram/src/bot-message-context.topic-agentid.test.ts index 57c0c8209a0..6a278b4c1a8 100644 --- a/extensions/telegram/src/bot-message-context.topic-agentid.test.ts +++ b/extensions/telegram/src/bot-message-context.topic-agentid.test.ts @@ -1,5 +1,5 @@ +import { loadConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { loadConfig } from "../../../src/config/config.js"; const { defaultRouteConfig } = vi.hoisted(() => ({ defaultRouteConfig: { @@ -11,8 +11,8 @@ const { defaultRouteConfig } = vi.hoisted(() => ({ }, })); -vi.mock("../../../src/config/config.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/config-runtime", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, loadConfig: vi.fn(() => defaultRouteConfig), diff --git a/extensions/telegram/src/bot-native-commands.group-auth.test.ts b/extensions/telegram/src/bot-native-commands.group-auth.test.ts index fe1373e5636..3a3adff7b8c 100644 --- a/extensions/telegram/src/bot-native-commands.group-auth.test.ts +++ b/extensions/telegram/src/bot-native-commands.group-auth.test.ts @@ -1,7 +1,7 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { ChannelGroupPolicy } from "openclaw/plugin-sdk/config-runtime"; +import type { TelegramAccountConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import type { ChannelGroupPolicy } from "../../../src/config/group-policy.js"; -import type { TelegramAccountConfig } from "../../../src/config/types.js"; import { createNativeCommandsHarness, createTelegramGroupCommandContext, diff --git a/extensions/telegram/src/bot-native-commands.menu-test-support.ts b/extensions/telegram/src/bot-native-commands.menu-test-support.ts index be7f683bd52..3442931226e 100644 --- a/extensions/telegram/src/bot-native-commands.menu-test-support.ts +++ b/extensions/telegram/src/bot-native-commands.menu-test-support.ts @@ -1,6 +1,6 @@ +import type { SkillCommandSpec } from "openclaw/plugin-sdk/command-auth"; import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { expect, vi } from "vitest"; -import type { SkillCommandSpec } from "../../../src/agents/skills.js"; import type { OpenClawConfig } from "../runtime-api.js"; import type { TelegramBotDeps } from "./bot-deps.js"; import { diff --git a/extensions/telegram/src/bot-native-commands.plugin-auth.test.ts b/extensions/telegram/src/bot-native-commands.plugin-auth.test.ts index 1e359845ae6..3bbec3d3e44 100644 --- a/extensions/telegram/src/bot-native-commands.plugin-auth.test.ts +++ b/extensions/telegram/src/bot-native-commands.plugin-auth.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { TelegramAccountConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import type { TelegramAccountConfig } from "../../../src/config/types.js"; let createNativeCommandsHarness: typeof import("./bot-native-commands.test-helpers.js").createNativeCommandsHarness; let deliverReplies: typeof import("./bot-native-commands.test-helpers.js").deliverReplies; diff --git a/extensions/telegram/src/bot-native-commands.registry.test.ts b/extensions/telegram/src/bot-native-commands.registry.test.ts index b7a58db039c..c3a8d970957 100644 --- a/extensions/telegram/src/bot-native-commands.registry.test.ts +++ b/extensions/telegram/src/bot-native-commands.registry.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; const deliveryMocks = vi.hoisted(() => ({ deliverReplies: vi.fn(async () => ({ delivered: true })), })); diff --git a/extensions/telegram/src/bot-native-commands.session-meta.test.ts b/extensions/telegram/src/bot-native-commands.session-meta.test.ts index b59650caf16..3284c823ae0 100644 --- a/extensions/telegram/src/bot-native-commands.session-meta.test.ts +++ b/extensions/telegram/src/bot-native-commands.session-meta.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { ResolvedAgentRoute } from "openclaw/plugin-sdk/routing"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import type { ResolvedAgentRoute } from "../../../src/routing/resolve-route.js"; import type { TelegramBotDeps } from "./bot-deps.js"; import { createDeferred, @@ -126,7 +126,7 @@ vi.mock("../../../src/config/sessions.js", () => ({ vi.mock("../../../src/pairing/pairing-store.js", () => ({ readChannelAllowFromStore: vi.fn(async () => []), })); -vi.mock("../../../src/infra/outbound/session-binding-service.js", () => ({ +vi.mock("openclaw/plugin-sdk/conversation-runtime", () => ({ getSessionBindingService: () => ({ bind: vi.fn(), getCapabilities: vi.fn(), diff --git a/extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts b/extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts index bbff5ec85bb..7a8f69b7c2e 100644 --- a/extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts +++ b/extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts @@ -1,9 +1,9 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { writeSkill } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { writeSkill } from "../../../src/agents/skills.e2e-test-helpers.js"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { pluginCommandMocks, resetPluginCommandMocks, diff --git a/extensions/telegram/src/bot-native-commands.test.ts b/extensions/telegram/src/bot-native-commands.test.ts index abaed79a54d..97d0b9420cf 100644 --- a/extensions/telegram/src/bot-native-commands.test.ts +++ b/extensions/telegram/src/bot-native-commands.test.ts @@ -1,9 +1,9 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { TELEGRAM_COMMAND_NAME_PATTERN } from "openclaw/plugin-sdk/config-runtime"; +import type { TelegramAccountConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; +import { STATE_DIR } from "openclaw/plugin-sdk/state-paths"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import { STATE_DIR } from "../../../src/config/paths.js"; -import { TELEGRAM_COMMAND_NAME_PATTERN } from "../../../src/config/telegram-custom-commands.js"; -import type { TelegramAccountConfig } from "../../../src/config/types.js"; -import type { RuntimeEnv } from "../../../src/runtime.js"; import { pluginCommandMocks, resetPluginCommandMocks, diff --git a/extensions/telegram/src/bot.test.ts b/extensions/telegram/src/bot.test.ts index ba2e82d8b43..e741f24b672 100644 --- a/extensions/telegram/src/bot.test.ts +++ b/extensions/telegram/src/bot.test.ts @@ -1,11 +1,11 @@ import { rm } from "node:fs/promises"; import type { PluginInteractiveTelegramHandlerContext } from "openclaw/plugin-sdk/core"; -import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { expectChannelInboundContextContract as expectInboundContextContract } from "../../../src/channels/plugins/contracts/suites.js"; import { clearPluginInteractiveHandlers, registerPluginInteractiveHandler, -} from "../../../src/plugins/interactive.js"; +} from "openclaw/plugin-sdk/plugin-runtime"; +import { expectChannelInboundContextContract as expectInboundContextContract } from "openclaw/plugin-sdk/testing"; +import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { escapeRegExp, formatEnvelopeTimestamp } from "../../../test/helpers/envelope-timestamp.js"; const { answerCallbackQuerySpy, @@ -31,7 +31,7 @@ const { let listNativeCommandSpecs: typeof import("../../../src/auto-reply/commands-registry.js").listNativeCommandSpecs; let listNativeCommandSpecsForConfig: typeof import("../../../src/auto-reply/commands-registry.js").listNativeCommandSpecsForConfig; let loadSessionStore: typeof import("../../../src/config/sessions.js").loadSessionStore; -let normalizeTelegramCommandName: typeof import("../../../src/config/telegram-custom-commands.js").normalizeTelegramCommandName; +let normalizeTelegramCommandName: typeof import("openclaw/plugin-sdk/config-runtime").normalizeTelegramCommandName; let createTelegramBotBase: typeof import("./bot.js").createTelegramBot; let setTelegramBotRuntimeForTest: typeof import("./bot.js").setTelegramBotRuntimeForTest; let createTelegramBot: ( @@ -54,8 +54,7 @@ describe("createTelegramBot", () => { ({ listNativeCommandSpecs, listNativeCommandSpecsForConfig } = await import("../../../src/auto-reply/commands-registry.js")); ({ loadSessionStore } = await import("../../../src/config/sessions.js")); - ({ normalizeTelegramCommandName } = - await import("../../../src/config/telegram-custom-commands.js")); + ({ normalizeTelegramCommandName } = await import("openclaw/plugin-sdk/config-runtime")); ({ createTelegramBot: createTelegramBotBase, setTelegramBotRuntimeForTest } = await import("./bot.js")); }); diff --git a/extensions/telegram/src/bot/delivery.test.ts b/extensions/telegram/src/bot/delivery.test.ts index c9347aa2dbb..c0f5a8e4270 100644 --- a/extensions/telegram/src/bot/delivery.test.ts +++ b/extensions/telegram/src/bot/delivery.test.ts @@ -1,6 +1,6 @@ import type { Bot } from "grammy"; +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { RuntimeEnv } from "../../../../src/runtime.js"; const { loadWebMedia } = vi.hoisted(() => ({ loadWebMedia: vi.fn(), diff --git a/extensions/telegram/src/channel-actions.test.ts b/extensions/telegram/src/channel-actions.test.ts index 9a319525673..2371d9b0b1f 100644 --- a/extensions/telegram/src/channel-actions.test.ts +++ b/extensions/telegram/src/channel-actions.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { telegramMessageActions, telegramMessageActionRuntime } from "./channel-actions.js"; const handleTelegramActionMock = vi.hoisted(() => vi.fn()); diff --git a/extensions/telegram/src/channel.test.ts b/extensions/telegram/src/channel.test.ts index aceb237d336..c2f35d54cfb 100644 --- a/extensions/telegram/src/channel.test.ts +++ b/extensions/telegram/src/channel.test.ts @@ -1,7 +1,7 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { PluginApprovalRequest } from "openclaw/plugin-sdk/infra-runtime"; +import type { PluginRuntime } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import type { PluginApprovalRequest } from "../../../src/infra/plugin-approvals.js"; -import type { PluginRuntime } from "../../../src/plugins/runtime/types.js"; import { createStartAccountContext } from "../../../test/helpers/plugins/start-account-context.js"; import type { ResolvedTelegramAccount } from "./accounts.js"; import * as auditModule from "./audit.js"; diff --git a/extensions/telegram/src/exec-approvals-handler.test.ts b/extensions/telegram/src/exec-approvals-handler.test.ts index 8ffd8d3611c..d005fc1f141 100644 --- a/extensions/telegram/src/exec-approvals-handler.test.ts +++ b/extensions/telegram/src/exec-approvals-handler.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { TelegramExecApprovalHandler } from "./exec-approvals-handler.js"; const baseRequest = { diff --git a/extensions/telegram/src/exec-approvals.test.ts b/extensions/telegram/src/exec-approvals.test.ts index 936cb51ea93..64951ded1a8 100644 --- a/extensions/telegram/src/exec-approvals.test.ts +++ b/extensions/telegram/src/exec-approvals.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { getTelegramExecApprovalApprovers, isTelegramExecApprovalAuthorizedSender, diff --git a/extensions/telegram/src/group-access.base-access.test.ts b/extensions/telegram/src/group-access.base-access.test.ts index 57d6847a198..ed48c363198 100644 --- a/extensions/telegram/src/group-access.base-access.test.ts +++ b/extensions/telegram/src/group-access.base-access.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { TelegramAccountConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import type { TelegramAccountConfig } from "../../../src/config/types.js"; import { normalizeAllowFrom, type NormalizedAllowFrom } from "./bot-access.js"; import { evaluateTelegramGroupBaseAccess, diff --git a/extensions/telegram/src/lane-delivery.test.ts b/extensions/telegram/src/lane-delivery.test.ts index 3470a6257c8..eb30a75be49 100644 --- a/extensions/telegram/src/lane-delivery.test.ts +++ b/extensions/telegram/src/lane-delivery.test.ts @@ -1,5 +1,5 @@ +import type { ReplyPayload } from "openclaw/plugin-sdk/reply-runtime"; import { describe, expect, it, vi } from "vitest"; -import type { ReplyPayload } from "../../../src/auto-reply/types.js"; import { createTestDraftStream } from "./draft-stream.test-helpers.js"; import { createLaneTextDeliverer, diff --git a/extensions/telegram/src/network-config.test.ts b/extensions/telegram/src/network-config.test.ts index 855e026f1b0..76c3bfeb3a8 100644 --- a/extensions/telegram/src/network-config.test.ts +++ b/extensions/telegram/src/network-config.test.ts @@ -1,5 +1,5 @@ +import type { TelegramNetworkConfig } from "openclaw/plugin-sdk/config-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { TelegramNetworkConfig } from "../../../src/config/types.telegram.js"; vi.mock("openclaw/plugin-sdk/runtime-env", async (importOriginal) => { const actual = await importOriginal(); diff --git a/extensions/telegram/src/reaction-level.test.ts b/extensions/telegram/src/reaction-level.test.ts index 612a8eec424..c9cb0c7bb74 100644 --- a/extensions/telegram/src/reaction-level.test.ts +++ b/extensions/telegram/src/reaction-level.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { afterAll, beforeAll, describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { resolveTelegramReactionLevel } from "./reaction-level.js"; type ReactionResolution = ReturnType; diff --git a/extensions/telegram/src/setup-surface.test.ts b/extensions/telegram/src/setup-surface.test.ts index db668937a86..17eeb2c68e9 100644 --- a/extensions/telegram/src/setup-surface.test.ts +++ b/extensions/telegram/src/setup-surface.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/setup"; import { describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { createTestWizardPrompter, runSetupWizardFinalize, diff --git a/extensions/telegram/src/status.test.ts b/extensions/telegram/src/status.test.ts index 0d1d8195e48..b1a9dee39af 100644 --- a/extensions/telegram/src/status.test.ts +++ b/extensions/telegram/src/status.test.ts @@ -1,6 +1,6 @@ import type { ChannelAccountSnapshot } from "openclaw/plugin-sdk/channel-contract"; +import { DEFAULT_EMOJIS } from "openclaw/plugin-sdk/channel-feedback"; import { describe, expect, it } from "vitest"; -import { DEFAULT_EMOJIS } from "../../../src/channels/status-reactions.js"; import type { TelegramChatDetails, TelegramGetChat } from "./bot/types.js"; import { collectTelegramStatusIssues } from "./status-issues.js"; import { diff --git a/extensions/telegram/src/thread-bindings.test.ts b/extensions/telegram/src/thread-bindings.test.ts index cc9bd2a1209..8d66d6e2672 100644 --- a/extensions/telegram/src/thread-bindings.test.ts +++ b/extensions/telegram/src/thread-bindings.test.ts @@ -1,9 +1,9 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; +import { getSessionBindingService } from "openclaw/plugin-sdk/conversation-runtime"; +import { resolveStateDir } from "openclaw/plugin-sdk/state-paths"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { resolveStateDir } from "../../../src/config/paths.js"; -import { getSessionBindingService } from "../../../src/infra/outbound/session-binding-service.js"; import { importFreshModule } from "../../../test/helpers/import-fresh.js"; import { __testing, diff --git a/extensions/telegram/src/token.test.ts b/extensions/telegram/src/token.test.ts index 4e9429bf238..ef500912bc9 100644 --- a/extensions/telegram/src/token.test.ts +++ b/extensions/telegram/src/token.test.ts @@ -1,9 +1,9 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { withStateDirEnv } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import { withStateDirEnv } from "../../../src/test-helpers/state-dir-env.js"; import { resolveTelegramToken } from "./token.js"; import { readTelegramUpdateOffset, writeTelegramUpdateOffset } from "./update-offset-store.js"; diff --git a/extensions/telegram/src/update-offset-store.test.ts b/extensions/telegram/src/update-offset-store.test.ts index 517944f6972..03ebf7407f1 100644 --- a/extensions/telegram/src/update-offset-store.test.ts +++ b/extensions/telegram/src/update-offset-store.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { withStateDirEnv } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { withStateDirEnv } from "../../../src/test-helpers/state-dir-env.js"; import { deleteTelegramUpdateOffset, readTelegramUpdateOffset, diff --git a/extensions/whatsapp/src/action-runtime.test.ts b/extensions/whatsapp/src/action-runtime.test.ts index b8fb950281a..e118480476b 100644 --- a/extensions/whatsapp/src/action-runtime.test.ts +++ b/extensions/whatsapp/src/action-runtime.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/routing"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js"; import { handleWhatsAppAction, whatsAppActionRuntime } from "./action-runtime.js"; const originalWhatsAppActionRuntime = { ...whatsAppActionRuntime }; diff --git a/extensions/whatsapp/src/auto-reply.broadcast-groups.combined.test.ts b/extensions/whatsapp/src/auto-reply.broadcast-groups.combined.test.ts index 3cc4421f594..0ef070cdb5c 100644 --- a/extensions/whatsapp/src/auto-reply.broadcast-groups.combined.test.ts +++ b/extensions/whatsapp/src/auto-reply.broadcast-groups.combined.test.ts @@ -1,6 +1,6 @@ import "./test-helpers.js"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { monitorWebChannelWithCapture, sendWebDirectInboundAndCollectSessionKeys, diff --git a/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts b/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts index a2285391f43..ad6ccba8361 100644 --- a/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts +++ b/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts @@ -1,9 +1,9 @@ import "./test-helpers.js"; import crypto from "node:crypto"; import fs from "node:fs/promises"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { setLoggerOverride } from "openclaw/plugin-sdk/runtime-env"; import { beforeAll, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import { setLoggerOverride } from "../../../src/logging.js"; import { escapeRegExp, formatEnvelopeTimestamp } from "../../../test/helpers/envelope-timestamp.js"; import { withEnvAsync } from "../../../test/helpers/plugins/env.js"; import { diff --git a/extensions/whatsapp/src/auto-reply.web-auto-reply.last-route.test.ts b/extensions/whatsapp/src/auto-reply.web-auto-reply.last-route.test.ts index 1783d3630fa..cc46fa1d993 100644 --- a/extensions/whatsapp/src/auto-reply.web-auto-reply.last-route.test.ts +++ b/extensions/whatsapp/src/auto-reply.web-auto-reply.last-route.test.ts @@ -1,6 +1,6 @@ import "./test-helpers.js"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { installWebAutoReplyUnitTestHooks, makeSessionStore } from "./auto-reply.test-harness.js"; const updateLastRouteInBackgroundMock = vi.hoisted(() => vi.fn()); diff --git a/extensions/whatsapp/src/auto-reply/deliver-reply.test.ts b/extensions/whatsapp/src/auto-reply/deliver-reply.test.ts index 56456a3d3ab..4f8866c6ee0 100644 --- a/extensions/whatsapp/src/auto-reply/deliver-reply.test.ts +++ b/extensions/whatsapp/src/auto-reply/deliver-reply.test.ts @@ -1,11 +1,11 @@ +import { logVerbose } from "openclaw/plugin-sdk/runtime-env"; +import { sleep } from "openclaw/plugin-sdk/runtime-env"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { logVerbose } from "../../../../src/globals.js"; -import { sleep } from "../../../../src/utils.js"; import { loadWebMedia } from "../media.js"; import type { WebInboundMsg } from "./types.js"; -vi.mock("../../../../src/globals.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/runtime-env", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, shouldLogVerbose: vi.fn(() => true), @@ -17,8 +17,8 @@ vi.mock("../media.js", () => ({ loadWebMedia: vi.fn(), })); -vi.mock("../../../../src/utils.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/runtime-env", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, sleep: vi.fn(async () => {}), diff --git a/extensions/whatsapp/src/auto-reply/heartbeat-runner.test.ts b/extensions/whatsapp/src/auto-reply/heartbeat-runner.test.ts index c770c0b5e55..87bbc6a8666 100644 --- a/extensions/whatsapp/src/auto-reply/heartbeat-runner.test.ts +++ b/extensions/whatsapp/src/auto-reply/heartbeat-runner.test.ts @@ -1,7 +1,7 @@ +import { redactIdentifier } from "openclaw/plugin-sdk/logging-core"; +import type { getReplyFromConfig } from "openclaw/plugin-sdk/reply-runtime"; +import { HEARTBEAT_TOKEN } from "openclaw/plugin-sdk/reply-runtime"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { getReplyFromConfig } from "../../../../src/auto-reply/reply.js"; -import { HEARTBEAT_TOKEN } from "../../../../src/auto-reply/tokens.js"; -import { redactIdentifier } from "../../../../src/logging/redact-identifier.js"; import type { sendMessageWhatsApp } from "../send.js"; const state = vi.hoisted(() => ({ @@ -91,11 +91,11 @@ vi.mock("openclaw/plugin-sdk/text-runtime", async (importOriginal) => { }; }); -vi.mock("../../../../src/auto-reply/reply.js", () => ({ +vi.mock("openclaw/plugin-sdk/reply-runtime", () => ({ getReplyFromConfig: vi.fn(async () => undefined), })); -vi.mock("../../../../src/config/sessions.js", () => ({ +vi.mock("openclaw/plugin-sdk/config-runtime", () => ({ loadSessionStore: () => state.store, resolveSessionKey: () => "k", resolveStorePath: () => "/tmp/store.json", diff --git a/extensions/whatsapp/src/auto-reply/monitor/process-message.inbound-context.test.ts b/extensions/whatsapp/src/auto-reply/monitor/process-message.inbound-context.test.ts index 27e0f514600..3fc7ecb38f9 100644 --- a/extensions/whatsapp/src/auto-reply/monitor/process-message.inbound-context.test.ts +++ b/extensions/whatsapp/src/auto-reply/monitor/process-message.inbound-context.test.ts @@ -1,8 +1,8 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import { expectChannelInboundContextContract as expectInboundContextContract } from "openclaw/plugin-sdk/testing"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { expectChannelInboundContextContract as expectInboundContextContract } from "../../../../../src/channels/plugins/contracts/suites.js"; let capturedCtx: unknown; let capturedDispatchParams: unknown; @@ -72,7 +72,7 @@ function createWhatsAppDirectStreamingArgs(params?: { channels: { whatsapp: { blockStreaming: true } }, messages: {}, session: { store: sessionStorePath }, - } as unknown as ReturnType, + } as unknown as ReturnType, msg: { id: "msg1", from: "+1555", @@ -228,7 +228,7 @@ describe("web processMessage inbound context", () => { }, messages: {}, session: { store: sessionStorePath }, - } as unknown as ReturnType); + } as unknown as ReturnType); expect(getDispatcherResponsePrefix()).toBe("[Mainbot]"); }); @@ -237,7 +237,7 @@ describe("web processMessage inbound context", () => { await processSelfDirectMessage({ messages: {}, session: { store: sessionStorePath }, - } as unknown as ReturnType); + } as unknown as ReturnType); expect(getDispatcherResponsePrefix()).toBeUndefined(); }); @@ -264,7 +264,7 @@ describe("web processMessage inbound context", () => { cfg: { messages: {}, session: { store: sessionStorePath }, - } as unknown as ReturnType, + } as unknown as ReturnType, msg: { id: "g1", from: "123@g.us", @@ -399,7 +399,7 @@ describe("web processMessage inbound context", () => { }, messages: {}, session: { store: sessionStorePath, dmScope: "main" }, - } as unknown as ReturnType, + } as unknown as ReturnType, msg: { id: params.messageId, from: params.from, diff --git a/extensions/whatsapp/src/auto-reply/web-auto-reply-monitor.test.ts b/extensions/whatsapp/src/auto-reply/web-auto-reply-monitor.test.ts index 412648b3180..49c703e809c 100644 --- a/extensions/whatsapp/src/auto-reply/web-auto-reply-monitor.test.ts +++ b/extensions/whatsapp/src/auto-reply/web-auto-reply-monitor.test.ts @@ -1,8 +1,8 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import { resolveAgentRoute } from "openclaw/plugin-sdk/routing"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { resolveAgentRoute } from "../../../../src/routing/resolve-route.js"; import { buildMentionConfig } from "./mentions.js"; import { applyGroupGating, type GroupHistoryEntry } from "./monitor/group-gating.js"; import { buildInboundLine, formatReplyContext } from "./monitor/message-line.js"; @@ -33,10 +33,10 @@ const makeConfig = (overrides: Record) => }, session: { store: sessionStorePath }, ...overrides, - }) as unknown as ReturnType; + }) as unknown as ReturnType; function runGroupGating(params: { - cfg: ReturnType; + cfg: ReturnType; msg: Record; conversationId?: string; agentId?: string; diff --git a/extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts b/extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts index b2cf0a5b6a2..d05014f9f03 100644 --- a/extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts +++ b/extensions/whatsapp/src/auto-reply/web-auto-reply-utils.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { saveSessionStore } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it, vi } from "vitest"; -import { saveSessionStore } from "../../../../src/config/sessions.js"; import { withTempDir } from "../../../../test/helpers/plugins/temp-dir.js"; import { debugMention, diff --git a/extensions/whatsapp/src/channel.test.ts b/extensions/whatsapp/src/channel.test.ts index a5bd024b342..b95e75076fe 100644 --- a/extensions/whatsapp/src/channel.test.ts +++ b/extensions/whatsapp/src/channel.test.ts @@ -1,10 +1,7 @@ +import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/routing"; +import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; +import { createWhatsAppPollFixture, expectWhatsAppPollSent } from "openclaw/plugin-sdk/testing"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js"; -import type { RuntimeEnv } from "../../../src/runtime.js"; -import { - createWhatsAppPollFixture, - expectWhatsAppPollSent, -} from "../../../src/test-helpers/whatsapp-outbound.js"; import { createDirectoryTestRuntime, expectDirectorySurface, diff --git a/extensions/whatsapp/src/login.test.ts b/extensions/whatsapp/src/login.test.ts index 637c3c3ff5c..652ce20cf86 100644 --- a/extensions/whatsapp/src/login.test.ts +++ b/extensions/whatsapp/src/login.test.ts @@ -1,8 +1,8 @@ import { EventEmitter } from "node:events"; import { readFile } from "node:fs/promises"; import { resolve } from "node:path"; +import { resetLogger, setLoggerOverride } from "openclaw/plugin-sdk/runtime-env"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { resetLogger, setLoggerOverride } from "../../../src/logging.js"; import { renderQrPngBase64 } from "./qr-image.js"; vi.mock("./session.js", async () => { diff --git a/extensions/whatsapp/src/media.test.ts b/extensions/whatsapp/src/media.test.ts index 66acdc60050..6ff15c4416c 100644 --- a/extensions/whatsapp/src/media.test.ts +++ b/extensions/whatsapp/src/media.test.ts @@ -1,12 +1,12 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import { optimizeImageToPng } from "openclaw/plugin-sdk/media-runtime"; +import { resolveStateDir } from "openclaw/plugin-sdk/state-paths"; +import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path"; +import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/testing"; import sharp from "sharp"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { resolveStateDir } from "../../../src/config/paths.js"; -import { resolvePreferredOpenClawTmpDir } from "../../../src/infra/tmp-openclaw-dir.js"; -import { optimizeImageToPng } from "../../../src/media/image-ops.js"; -import { mockPinnedHostnameResolution } from "../../../src/test-helpers/ssrf.js"; import { captureEnv } from "../../../test/helpers/plugins/env.js"; let LocalMediaAccessError: typeof import("./media.js").LocalMediaAccessError; diff --git a/extensions/whatsapp/src/outbound-adapter.poll.test.ts b/extensions/whatsapp/src/outbound-adapter.poll.test.ts index 6d6aac486ad..322afc609fa 100644 --- a/extensions/whatsapp/src/outbound-adapter.poll.test.ts +++ b/extensions/whatsapp/src/outbound-adapter.poll.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; const hoisted = vi.hoisted(() => ({ sendPollWhatsApp: vi.fn(async () => ({ messageId: "poll-1", toJid: "1555@s.whatsapp.net" })), diff --git a/extensions/whatsapp/src/reconnect.test.ts b/extensions/whatsapp/src/reconnect.test.ts index 019ca176b43..fe00fda6132 100644 --- a/extensions/whatsapp/src/reconnect.test.ts +++ b/extensions/whatsapp/src/reconnect.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { computeBackoff, DEFAULT_HEARTBEAT_SECONDS, diff --git a/extensions/whatsapp/src/send.test.ts b/extensions/whatsapp/src/send.test.ts index 73ecaedd474..820b7e8740f 100644 --- a/extensions/whatsapp/src/send.test.ts +++ b/extensions/whatsapp/src/send.test.ts @@ -2,17 +2,17 @@ import crypto from "node:crypto"; import fsSync from "node:fs"; import os from "node:os"; import path from "node:path"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { redactIdentifier } from "openclaw/plugin-sdk/logging-core"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import { redactIdentifier } from "../../../src/logging/redact-identifier.js"; const loadWebMediaMock = vi.fn(); let sendMessageWhatsApp: typeof import("./send.js").sendMessageWhatsApp; let sendPollWhatsApp: typeof import("./send.js").sendPollWhatsApp; let sendReactionWhatsApp: typeof import("./send.js").sendReactionWhatsApp; let setActiveWebListener: typeof import("./active-listener.js").setActiveWebListener; -let resetLogger: typeof import("../../../src/logging.js").resetLogger; -let setLoggerOverride: typeof import("../../../src/logging.js").setLoggerOverride; +let resetLogger: typeof import("openclaw/plugin-sdk/runtime-env").resetLogger; +let setLoggerOverride: typeof import("openclaw/plugin-sdk/runtime-env").setLoggerOverride; vi.mock("./media.js", () => ({ loadWebMedia: (...args: unknown[]) => loadWebMediaMock(...args), @@ -28,7 +28,7 @@ describe("web outbound", () => { vi.resetModules(); ({ sendMessageWhatsApp, sendPollWhatsApp, sendReactionWhatsApp } = await import("./send.js")); ({ setActiveWebListener } = await import("./active-listener.js")); - ({ resetLogger, setLoggerOverride } = await import("../../../src/logging.js")); + ({ resetLogger, setLoggerOverride } = await import("openclaw/plugin-sdk/runtime-env")); }); beforeEach(() => { diff --git a/extensions/whatsapp/src/session.test.ts b/extensions/whatsapp/src/session.test.ts index c6d01b0bcb2..e902704f74c 100644 --- a/extensions/whatsapp/src/session.test.ts +++ b/extensions/whatsapp/src/session.test.ts @@ -1,8 +1,8 @@ import { EventEmitter } from "node:events"; import fsSync from "node:fs"; import path from "node:path"; +import { resetLogger, setLoggerOverride } from "openclaw/plugin-sdk/runtime-env"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { resetLogger, setLoggerOverride } from "../../../src/logging.js"; import { baileys, getLastSocket, resetBaileysMocks, resetLoadConfigMock } from "./test-helpers.js"; const useMultiFileAuthStateMock = vi.mocked(baileys.useMultiFileAuthState); diff --git a/extensions/xai/onboard.test.ts b/extensions/xai/onboard.test.ts index 8163fce500d..769ed6ef6ef 100644 --- a/extensions/xai/onboard.test.ts +++ b/extensions/xai/onboard.test.ts @@ -1,8 +1,8 @@ -import { describe, expect, it } from "vitest"; import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, -} from "../../src/config/model-input.js"; +} from "openclaw/plugin-sdk/provider-onboard"; +import { describe, expect, it } from "vitest"; import { createConfigWithFallbacks, createLegacyProviderConfig, diff --git a/extensions/xai/web-search.test.ts b/extensions/xai/web-search.test.ts index 59636d92a22..44d652aee74 100644 --- a/extensions/xai/web-search.test.ts +++ b/extensions/xai/web-search.test.ts @@ -1,7 +1,7 @@ +import { NON_ENV_SECRETREF_MARKER } from "openclaw/plugin-sdk/provider-auth-runtime"; +import { createNonExitingRuntime } from "openclaw/plugin-sdk/runtime-env"; +import { capturePluginRegistration } from "openclaw/plugin-sdk/testing"; import { describe, expect, it, vi } from "vitest"; -import { NON_ENV_SECRETREF_MARKER } from "../../src/agents/model-auth-markers.js"; -import { capturePluginRegistration } from "../../src/plugins/captured-registration.js"; -import { createNonExitingRuntime } from "../../src/runtime.js"; import { withEnv } from "../../test/helpers/plugins/env.js"; import { createWizardPrompter } from "../../test/helpers/wizard-prompter.js"; import xaiPlugin from "./index.js"; diff --git a/extensions/xiaomi/onboard.test.ts b/extensions/xiaomi/onboard.test.ts index 0af93da77b9..89f8529592f 100644 --- a/extensions/xiaomi/onboard.test.ts +++ b/extensions/xiaomi/onboard.test.ts @@ -1,5 +1,5 @@ +import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; import { describe, expect, it } from "vitest"; -import { resolveAgentModelPrimaryValue } from "../../src/config/model-input.js"; import { createLegacyProviderConfig } from "../../test/helpers/plugins/onboard-config.js"; import { applyXiaomiConfig, applyXiaomiProviderConfig } from "./onboard.js"; diff --git a/extensions/zai/onboard.test.ts b/extensions/zai/onboard.test.ts index 5fe1fd732d9..5b40a6ffc60 100644 --- a/extensions/zai/onboard.test.ts +++ b/extensions/zai/onboard.test.ts @@ -1,5 +1,5 @@ +import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; import { describe, expect, it } from "vitest"; -import { resolveAgentModelPrimaryValue } from "../../src/config/model-input.js"; import { ZAI_CODING_CN_BASE_URL, ZAI_GLOBAL_BASE_URL } from "./model-definitions.js"; import { applyZaiConfig, applyZaiProviderConfig } from "./onboard.js"; diff --git a/extensions/zalo/src/monitor.lifecycle.test.ts b/extensions/zalo/src/monitor.lifecycle.test.ts index 6e22fbe9dd3..31e80abf675 100644 --- a/extensions/zalo/src/monitor.lifecycle.test.ts +++ b/extensions/zalo/src/monitor.lifecycle.test.ts @@ -1,6 +1,6 @@ +import { createEmptyPluginRegistry } from "openclaw/plugin-sdk/testing"; +import { setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createEmptyPluginRegistry } from "../../../src/plugins/registry.js"; -import { setActivePluginRegistry } from "../../../src/plugins/runtime.js"; import { createRuntimeEnv } from "../../../test/helpers/plugins/runtime-env.js"; import type { OpenClawConfig } from "../runtime-api.js"; import type { ResolvedZaloAccount } from "./accounts.js"; diff --git a/extensions/zalo/src/monitor.webhook.test.ts b/extensions/zalo/src/monitor.webhook.test.ts index 1ba94d5c142..df12e35111f 100644 --- a/extensions/zalo/src/monitor.webhook.test.ts +++ b/extensions/zalo/src/monitor.webhook.test.ts @@ -1,7 +1,7 @@ import type { RequestListener } from "node:http"; +import { createEmptyPluginRegistry } from "openclaw/plugin-sdk/testing"; +import { setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createEmptyPluginRegistry } from "../../../src/plugins/registry.js"; -import { setActivePluginRegistry } from "../../../src/plugins/runtime.js"; import { withServer } from "../../../test/helpers/http-test-server.js"; import { createImageLifecycleCore, diff --git a/extensions/zalouser/src/channel.sendpayload.test.ts b/extensions/zalouser/src/channel.sendpayload.test.ts index cec5daf2b0b..ae672194f3b 100644 --- a/extensions/zalouser/src/channel.sendpayload.test.ts +++ b/extensions/zalouser/src/channel.sendpayload.test.ts @@ -1,5 +1,5 @@ +import { primeChannelOutboundSendMock } from "openclaw/plugin-sdk/testing"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { primeChannelOutboundSendMock } from "../../../src/channels/plugins/contracts/suites.js"; import "./accounts.test-mocks.js"; import "./zalo-js.test-mocks.js"; import type { ReplyPayload } from "../runtime-api.js"; diff --git a/src/plugin-sdk/acp-runtime.ts b/src/plugin-sdk/acp-runtime.ts index 1657cb7cace..094173426e4 100644 --- a/src/plugin-sdk/acp-runtime.ts +++ b/src/plugin-sdk/acp-runtime.ts @@ -1,6 +1,9 @@ // Public ACP runtime helpers for plugins that integrate with ACP control/session state. -export { getAcpSessionManager } from "../acp/control-plane/manager.js"; +import { __testing as managerTesting, getAcpSessionManager } from "../acp/control-plane/manager.js"; +import { __testing as registryTesting } from "../acp/runtime/registry.js"; + +export { getAcpSessionManager }; export { AcpRuntimeError, isAcpRuntimeError } from "../acp/runtime/errors.js"; export type { AcpRuntimeErrorCode } from "../acp/runtime/errors.js"; export { @@ -22,3 +25,8 @@ export type { } from "../acp/runtime/types.js"; export { readAcpSessionEntry } from "../acp/runtime/session-meta.js"; export type { AcpSessionStoreEntry } from "../acp/runtime/session-meta.js"; + +export const __testing = { + ...managerTesting, + ...registryTesting, +}; diff --git a/src/plugin-sdk/command-auth.ts b/src/plugin-sdk/command-auth.ts index 4141be75d2b..a20d2709382 100644 --- a/src/plugin-sdk/command-auth.ts +++ b/src/plugin-sdk/command-auth.ts @@ -48,6 +48,7 @@ export type { ResolvedCommandArgChoice, ShouldHandleTextCommandsParams, } from "../auto-reply/commands-registry.js"; +export type { CommandArgsParsing } from "../auto-reply/commands-registry.types.js"; export { resolveCommandAuthorizedFromAuthorizers, resolveControlCommandGate, @@ -69,6 +70,7 @@ export { listSkillCommandsForWorkspace, resolveSkillCommandInvocation, } from "../auto-reply/skill-commands.js"; +export type { SkillCommandSpec } from "../agents/skills.js"; export { buildCommandsPaginationKeyboard } from "../auto-reply/reply/commands-info.js"; export { buildModelsProviderData, diff --git a/src/plugin-sdk/config-runtime.ts b/src/plugin-sdk/config-runtime.ts index fda8a8a4b31..626f55be56b 100644 --- a/src/plugin-sdk/config-runtime.ts +++ b/src/plugin-sdk/config-runtime.ts @@ -3,9 +3,11 @@ export { resolveDefaultAgentId } from "../agents/agent-scope.js"; export { + clearRuntimeConfigSnapshot, getRuntimeConfigSnapshot, loadConfig, readConfigFileSnapshotForWrite, + setRuntimeConfigSnapshot, writeConfigFile, } from "../config/io.js"; export { logConfigUpdated } from "../config/logging.js"; @@ -87,9 +89,11 @@ export type { TtsProvider, } from "../config/types.js"; export { + clearSessionStoreCacheForTest, loadSessionStore, readSessionUpdatedAt, recordSessionMetaFromInbound, + saveSessionStore, resolveSessionKey, resolveStorePath, updateLastRoute, diff --git a/src/plugin-sdk/conversation-runtime.ts b/src/plugin-sdk/conversation-runtime.ts index 9f2747d8704..2fc8c87bf9d 100644 --- a/src/plugin-sdk/conversation-runtime.ts +++ b/src/plugin-sdk/conversation-runtime.ts @@ -86,6 +86,7 @@ export { registerSessionBindingAdapter, unregisterSessionBindingAdapter, } from "../infra/outbound/session-binding-service.js"; +export { __testing } from "../infra/outbound/session-binding-service.js"; export * from "../pairing/pairing-challenge.js"; export { resolvePairingIdLabel } from "../pairing/pairing-labels.js"; export * from "../pairing/pairing-messages.js"; diff --git a/src/plugin-sdk/logging-core.ts b/src/plugin-sdk/logging-core.ts index e9a9ec93abf..241bbb44de2 100644 --- a/src/plugin-sdk/logging-core.ts +++ b/src/plugin-sdk/logging-core.ts @@ -1,2 +1,3 @@ export { createSubsystemLogger } from "../logging/subsystem.js"; +export { redactIdentifier } from "../logging/redact-identifier.js"; export { redactSensitiveText } from "../logging/redact.js"; diff --git a/src/plugin-sdk/package-contract-guardrails.test.ts b/src/plugin-sdk/package-contract-guardrails.test.ts index a913b7c46e5..d26f3f3b8d8 100644 --- a/src/plugin-sdk/package-contract-guardrails.test.ts +++ b/src/plugin-sdk/package-contract-guardrails.test.ts @@ -1,5 +1,5 @@ import { execFileSync } from "node:child_process"; -import { mkdirSync, mkdtempSync, readFileSync, rmSync } from "node:fs"; +import { mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync } from "node:fs"; import { createRequire } from "node:module"; import os from "node:os"; import { dirname, join, resolve } from "node:path"; @@ -157,6 +157,45 @@ function buildLegacyPluginSourceAlias(): string { return ["openclaw", ["plugin", "source"].join("-")].join("/") + "/"; } +function collectExtensionFiles(dir: string): string[] { + const entries = readdirSync(dir, { withFileTypes: true }); + const files: string[] = []; + for (const entry of entries) { + if (entry.name === "dist" || entry.name === "node_modules") { + continue; + } + const nextPath = join(dir, entry.name); + if (entry.isDirectory()) { + files.push(...collectExtensionFiles(nextPath)); + continue; + } + if (!entry.isFile() || !/\.(?:[cm]?ts|tsx|mts|cts)$/.test(entry.name)) { + continue; + } + files.push(nextPath); + } + return files; +} + +function collectExtensionCoreImportLeaks(): Array<{ file: string; specifier: string }> { + const leaks: Array<{ file: string; specifier: string }> = []; + const importPattern = /\b(?:import|export)\b[\s\S]*?\bfrom\s*["']((?:\.\.\/)+src\/[^"']+)["']/g; + for (const file of collectExtensionFiles(resolve(REPO_ROOT, "extensions"))) { + const source = readFileSync(file, "utf8"); + for (const match of source.matchAll(importPattern)) { + const specifier = match[1]; + if (!specifier) { + continue; + } + leaks.push({ + file: file.replaceAll(`${REPO_ROOT}/`, ""), + specifier, + }); + } + } + return leaks; +} + describe("plugin-sdk package contract guardrails", () => { it("keeps package.json exports aligned with built plugin-sdk entrypoints", () => { expect(collectPluginSdkPackageExports()).toEqual([...pluginSdkEntrypoints].toSorted()); @@ -235,4 +274,8 @@ describe("plugin-sdk package contract guardrails", () => { expect(readGeneratedFacadeTypeMap()).not.toContain("../../extensions/"); expect(readGeneratedFacadeTypeMap()).not.toContain(buildLegacyPluginSourceAlias()); }); + + it("keeps extension sources on public sdk or local package seams", () => { + expect(collectExtensionCoreImportLeaks()).toEqual([]); + }); }); diff --git a/src/plugin-sdk/provider-auth-runtime.ts b/src/plugin-sdk/provider-auth-runtime.ts index 0851e99fa18..7d8f6ee7286 100644 --- a/src/plugin-sdk/provider-auth-runtime.ts +++ b/src/plugin-sdk/provider-auth-runtime.ts @@ -1,6 +1,7 @@ // Public runtime auth helpers for provider plugins. export { resolveEnvApiKey } from "../agents/model-auth-env.js"; +export { NON_ENV_SECRETREF_MARKER } from "../agents/model-auth-markers.js"; export { requireApiKey, resolveAwsSdkEnvVarName, diff --git a/src/plugin-sdk/provider-onboard.ts b/src/plugin-sdk/provider-onboard.ts index 9c6c4ba8943..39b105b10e6 100644 --- a/src/plugin-sdk/provider-onboard.ts +++ b/src/plugin-sdk/provider-onboard.ts @@ -17,6 +17,10 @@ type NormalizedModelRef = { }; export type { OpenClawConfig, ModelApi, ModelDefinitionConfig, ModelProviderConfig }; +export { + resolveAgentModelFallbackValues, + resolveAgentModelPrimaryValue, +} from "../config/model-input.js"; export type AgentModelAliasEntry = | string diff --git a/src/plugin-sdk/reply-runtime.ts b/src/plugin-sdk/reply-runtime.ts index e388140a8de..284239e3c5b 100644 --- a/src/plugin-sdk/reply-runtime.ts +++ b/src/plugin-sdk/reply-runtime.ts @@ -32,6 +32,10 @@ export { isAbortRequestText } from "../auto-reply/reply/abort.js"; export { isBtwRequestText } from "../auto-reply/reply/btw-command.js"; export { resetInboundDedupe } from "../auto-reply/reply/inbound-dedupe.js"; export { finalizeInboundContext } from "../auto-reply/reply/inbound-context.js"; +export { + createInboundDebouncer, + resolveInboundDebounceMs, +} from "../auto-reply/inbound-debounce.js"; export { dispatchReplyWithBufferedBlockDispatcher, dispatchReplyWithDispatcher, diff --git a/src/plugin-sdk/runtime-env.ts b/src/plugin-sdk/runtime-env.ts index ef304625eb5..85bb087f8f9 100644 --- a/src/plugin-sdk/runtime-env.ts +++ b/src/plugin-sdk/runtime-env.ts @@ -16,6 +16,8 @@ export { success, warn, } from "../globals.js"; +export { sleep } from "../utils.js"; +export { withTimeout } from "../utils/with-timeout.js"; export { isTruthyEnvValue } from "../infra/env.js"; export * from "../logging.js"; export { waitForAbortSignal } from "../infra/abort-signal.js"; diff --git a/src/plugin-sdk/synthetic.ts b/src/plugin-sdk/synthetic.ts index e0ea717eb71..8d2c05c1ad0 100644 --- a/src/plugin-sdk/synthetic.ts +++ b/src/plugin-sdk/synthetic.ts @@ -31,6 +31,8 @@ export const buildSyntheticProvider: FacadeModule["buildSyntheticProvider"] = (( loadFacadeModule()["buildSyntheticProvider"](...args)) as FacadeModule["buildSyntheticProvider"]; export const SYNTHETIC_BASE_URL: FacadeModule["SYNTHETIC_BASE_URL"] = loadFacadeModule()["SYNTHETIC_BASE_URL"]; +export const SYNTHETIC_DEFAULT_MODEL_ID: FacadeModule["SYNTHETIC_DEFAULT_MODEL_ID"] = + loadFacadeModule()["SYNTHETIC_DEFAULT_MODEL_ID"]; export const SYNTHETIC_DEFAULT_MODEL_REF: FacadeModule["SYNTHETIC_DEFAULT_MODEL_REF"] = loadFacadeModule()["SYNTHETIC_DEFAULT_MODEL_REF"]; export const SYNTHETIC_MODEL_CATALOG: FacadeModule["SYNTHETIC_MODEL_CATALOG"] = diff --git a/src/plugin-sdk/testing.ts b/src/plugin-sdk/testing.ts index 94c8d6d9ff6..b09868a4625 100644 --- a/src/plugin-sdk/testing.ts +++ b/src/plugin-sdk/testing.ts @@ -6,11 +6,57 @@ import { expect, it } from "vitest"; // Keep this list additive and limited to helpers we are willing to support. export { removeAckReactionAfterReply, shouldAckReaction } from "../channels/ack-reactions.js"; +export { + createSlackOutboundPayloadHarness, + expectChannelInboundContextContract, + primeChannelOutboundSendMock, +} from "../channels/plugins/contracts/suites.js"; +export { buildDispatchInboundCaptureMock } from "../channels/plugins/contracts/inbound-testkit.js"; +export { + createCliRuntimeCapture, + firstWrittenJsonArg, + spyRuntimeErrors, + spyRuntimeJson, + spyRuntimeLogs, +} from "../cli/test-runtime-capture.js"; +export type { CliMockOutputRuntime, CliRuntimeCapture } from "../cli/test-runtime-capture.js"; +export { setDefaultChannelPluginRegistryForTests } from "../commands/channel-test-helpers.js"; export type { ChannelAccountSnapshot, ChannelGatewayContext } from "../channels/plugins/types.js"; export type { OpenClawConfig } from "../config/config.js"; +export { callGateway } from "../gateway/call.js"; +export { createEmptyPluginRegistry } from "../plugins/registry.js"; +export { + getActivePluginRegistry, + resetPluginRuntimeStateForTest, + setActivePluginRegistry, +} from "../plugins/runtime.js"; +export { capturePluginRegistration } from "../plugins/captured-registration.js"; +export { resolveProviderPluginChoice } from "../plugins/provider-auth-choice.runtime.js"; export type { PluginRuntime } from "../plugins/runtime/types.js"; export type { RuntimeEnv } from "../runtime.js"; export type { MockFn } from "../test-utils/vitest-mock-fn.js"; +export { + createAuthCaptureJsonFetch, + createRequestCaptureJsonFetch, + installPinnedHostnameTestHooks, +} from "../media-understanding/audio.test-helpers.ts"; +export { isLiveTestEnabled } from "../agents/live-test-helpers.js"; +export { createSandboxTestContext } from "../agents/sandbox/test-fixtures.js"; +export { writeSkill } from "../agents/skills.e2e-test-helpers.js"; +export { __testing } from "../acp/control-plane/manager.js"; +export { __testing as acpManagerTesting } from "../acp/control-plane/manager.js"; +export { runAcpRuntimeAdapterContract } from "../acp/runtime/adapter-contract.testkit.js"; +export { handleAcpCommand } from "../auto-reply/reply/commands-acp.js"; +export { buildCommandTestParams } from "../auto-reply/reply/commands-spawn.test-harness.js"; +export { peekSystemEvents, resetSystemEventsForTest } from "../infra/system-events.js"; +export { jsonResponse, requestBodyText, requestUrl } from "../test-helpers/http.js"; +export { mockPinnedHostnameResolution } from "../test-helpers/ssrf.js"; +export { + createWhatsAppPollFixture, + expectWhatsAppPollSent, +} from "../test-helpers/whatsapp-outbound.js"; +export { sanitizeTerminalText } from "../terminal/safe-text.js"; +export { withStateDirEnv } from "../test-helpers/state-dir-env.js"; /** Create a tiny Windows `.cmd` shim fixture for plugin tests that spawn CLIs. */ export async function createWindowsCmdShimFixture(params: {