From 74e62c32c38cec9e10101fe4b6997abe8973e43d Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 27 Apr 2026 21:58:08 +0100 Subject: [PATCH] test: route extension tests through sdk subpaths --- extensions/active-memory/config.test.ts | 3 +- extensions/amazon-bedrock/index.test.ts | 6 +-- extensions/arcee/index.test.ts | 4 +- .../azure-speech/azure-speech.live.test.ts | 2 +- .../src/brave-web-search-provider.test.ts | 2 +- .../client-fetch.attach-only.e2e.test.ts | 2 +- extensions/byteplus/live.test.ts | 4 +- .../codex/src/app-server/compact.test.ts | 2 +- ...delivery-no-reply-runtime-contract.test.ts | 2 +- .../src/app-server/dynamic-tools.test.ts | 14 +++--- .../src/app-server/event-projector.test.ts | 8 +-- ...enclaw-owned-tool-runtime-contract.test.ts | 2 +- .../outcome-fallback-runtime-contract.test.ts | 2 +- .../run-attempt.context-engine.test.ts | 19 +++---- .../codex/src/app-server/run-attempt.test.ts | 12 ++--- .../src/app-server/transcript-mirror.test.ts | 16 +++--- extensions/comfy/comfy.live.test.ts | 6 +-- extensions/comfy/index.test.ts | 2 +- extensions/deepgram/audio.live.test.ts | 2 +- extensions/deepgram/audio.test.ts | 4 +- .../realtime-transcription-provider.test.ts | 2 +- extensions/deepseek/deepseek.live.test.ts | 4 +- extensions/deepseek/index.test.ts | 4 +- .../diagnostics-otel/src/service.test.ts | 2 +- extensions/diffs/src/config.test.ts | 2 +- .../discord/src/approval-native.test.ts | 2 +- extensions/discord/src/channel.test.ts | 2 +- extensions/discord/src/client.proxy.test.ts | 2 +- .../monitor/monitor.agent-components.test.ts | 5 +- .../discord/src/send.webhook.proxy.test.ts | 2 +- extensions/elevenlabs/elevenlabs.live.test.ts | 2 +- .../realtime-transcription-provider.test.ts | 2 +- .../firecrawl/src/firecrawl-tools.test.ts | 2 +- extensions/fireworks/index.test.ts | 2 +- extensions/github-copilot/index.test.ts | 4 +- .../google-meet/google-meet.live.test.ts | 2 +- extensions/google/google.live.test.ts | 2 +- ...media-understanding-provider.video.test.ts | 6 +-- extensions/google/web-search-provider.test.ts | 2 +- .../src/monitor.webhook-routing.test.ts | 3 +- .../googlechat/src/secret-contract.test.ts | 8 +-- extensions/gradium/gradium.live.test.ts | 2 +- .../src/monitor/inbound-processing.test.ts | 2 +- extensions/imessage/src/test-plugin.test.ts | 4 +- extensions/inworld/inworld.live.test.ts | 2 +- extensions/memory-core/src/cli.test.ts | 4 +- extensions/memory-core/src/config.test.ts | 3 +- .../src/dreaming-narrative.test.ts | 2 +- .../memory-core/src/memory/embeddings.test.ts | 2 +- .../memory-core/src/memory/index.test.ts | 4 +- .../src/memory/manager.watcher-config.test.ts | 4 +- .../memory-core/src/tools.citations.test.ts | 4 +- extensions/memory-lancedb/config.test.ts | 3 +- extensions/memory-wiki/cli-metadata.test.ts | 2 +- extensions/memory-wiki/src/bridge.test.ts | 10 ++-- extensions/memory-wiki/src/config.test.ts | 2 +- extensions/microsoft/microsoft.live.test.ts | 2 +- extensions/migrate-hermes/provider.test.ts | 2 +- .../minimax/image-generation-provider.test.ts | 2 +- extensions/minimax/minimax.live.test.ts | 2 +- .../media-understanding-provider.test.ts | 4 +- extensions/mistral/mistral.live.test.ts | 2 +- .../realtime-transcription-provider.test.ts | 2 +- .../media-understanding-provider.test.ts | 4 +- extensions/moonshot/moonshot.live.test.ts | 2 +- .../msteams/src/attachments.graph.test.ts | 2 +- extensions/msteams/src/messenger.test.ts | 2 +- .../music-generation-providers.live.test.ts | 24 +++++---- extensions/nvidia/index.test.ts | 2 +- extensions/ollama/src/provider-models.test.ts | 2 +- extensions/ollama/src/setup.test.ts | 2 +- .../media-understanding-provider.test.ts | 4 +- extensions/openai/openai-tts.live.test.ts | 2 +- extensions/openshell/src/backend.e2e.test.ts | 2 +- .../openshell/src/openshell-core.test.ts | 2 +- extensions/qa-channel/src/channel.test.ts | 2 +- extensions/qianfan/index.test.ts | 2 +- extensions/qqbot/src/config.test.ts | 3 +- extensions/qqbot/src/manifest-schema.test.ts | 2 +- .../qwen/media-understanding-provider.test.ts | 4 +- .../media-understanding-provider.test.ts | 4 +- .../event-handler.mention-gating.test.ts | 2 +- extensions/slack/src/approval-native.test.ts | 2 +- .../telegram/src/approval-native.test.ts | 2 +- .../telegram/src/bot-message-dispatch.test.ts | 2 +- .../src/bot-native-commands.registry.test.ts | 4 +- extensions/telegram/src/bot.test.ts | 2 +- .../bot/delivery.resolve-media-retry.test.ts | 2 +- extensions/telegram/src/bot/delivery.test.ts | 21 ++++---- extensions/telegram/src/token.test.ts | 2 +- .../telegram/src/update-offset-store.test.ts | 2 +- .../video-generation-providers.live.test.ts | 50 +++++++++---------- extensions/vydra/vydra.live.test.ts | 2 +- extensions/xiaomi/xiaomi.live.test.ts | 2 +- extensions/zai/index.test.ts | 2 +- extensions/zalo/src/monitor.lifecycle.test.ts | 3 +- .../src/monitor.polling.media-reply.test.ts | 3 +- extensions/zalo/src/monitor.webhook.test.ts | 3 +- 98 files changed, 202 insertions(+), 213 deletions(-) diff --git a/extensions/active-memory/config.test.ts b/extensions/active-memory/config.test.ts index 3c2a32b3ef2..bbba7a9d81b 100644 --- a/extensions/active-memory/config.test.ts +++ b/extensions/active-memory/config.test.ts @@ -1,7 +1,6 @@ import fs from "node:fs"; +import { type JsonSchemaObject, validateJsonSchemaValue } from "openclaw/plugin-sdk/config-schema"; import { describe, expect, it } from "vitest"; -import { validateJsonSchemaValue } from "../../src/plugins/schema-validator.js"; -import type { JsonSchemaObject } from "../../src/shared/json-schema.types.js"; const manifest = JSON.parse( fs.readFileSync(new URL("./openclaw.plugin.json", import.meta.url), "utf-8"), diff --git a/extensions/amazon-bedrock/index.test.ts b/extensions/amazon-bedrock/index.test.ts index 571d14881f0..9631167b7ac 100644 --- a/extensions/amazon-bedrock/index.test.ts +++ b/extensions/amazon-bedrock/index.test.ts @@ -1,9 +1,9 @@ import { readFileSync } from "node:fs"; import { resolve } from "node:path"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import type { PluginRuntime } from "openclaw/plugin-sdk/core"; +import { buildPluginApi } from "openclaw/plugin-sdk/testing"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../src/config/config.js"; -import { buildPluginApi } from "../../src/plugins/api-builder.js"; -import type { PluginRuntime } from "../../src/plugins/runtime/types.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; import { resetBedrockDiscoveryCacheForTest } from "./discovery.js"; import amazonBedrockPlugin from "./index.js"; diff --git a/extensions/arcee/index.test.ts b/extensions/arcee/index.test.ts index 2190d5051cc..19e63741bd8 100644 --- a/extensions/arcee/index.test.ts +++ b/extensions/arcee/index.test.ts @@ -1,6 +1,6 @@ +import { resolveProviderAuthEnvVarCandidates } from "openclaw/plugin-sdk/provider-env-vars"; +import { resolveProviderPluginChoice } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { resolveProviderPluginChoice } from "../../src/plugins/provider-auth-choice.runtime.js"; -import { resolveProviderAuthEnvVarCandidates } from "../../src/secrets/provider-env-vars.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; import { runSingleProviderCatalog } from "../test-support/provider-model-test-helpers.js"; import arceePlugin from "./index.js"; diff --git a/extensions/azure-speech/azure-speech.live.test.ts b/extensions/azure-speech/azure-speech.live.test.ts index 19ecbcbef86..44a45ae243f 100644 --- a/extensions/azure-speech/azure-speech.live.test.ts +++ b/extensions/azure-speech/azure-speech.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 { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/brave/src/brave-web-search-provider.test.ts b/extensions/brave/src/brave-web-search-provider.test.ts index 245feb07ab8..cfc351e848d 100644 --- a/extensions/brave/src/brave-web-search-provider.test.ts +++ b/extensions/brave/src/brave-web-search-provider.test.ts @@ -1,6 +1,6 @@ import fs from "node:fs"; +import { validateJsonSchemaValue } from "openclaw/plugin-sdk/config-schema"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { validateJsonSchemaValue } from "../../../src/plugins/schema-validator.js"; import { __testing } from "../test-api.js"; import { createBraveWebSearchProvider } from "./brave-web-search-provider.js"; diff --git a/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts b/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts index 5bee263b3ff..f5f146b1eb7 100644 --- a/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts +++ b/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts @@ -1,8 +1,8 @@ import fs from "node:fs/promises"; import net from "node:net"; import path from "node:path"; +import { clearConfigCache, clearRuntimeConfigSnapshot } from "openclaw/plugin-sdk/config-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { clearConfigCache, clearRuntimeConfigSnapshot } from "../../../../src/config/config.js"; import { createTempHomeEnv } from "../../test-support.js"; import { stopBrowserControlService } from "../control-service.js"; import { fetchBrowserJson } from "./client-fetch.js"; diff --git a/extensions/byteplus/live.test.ts b/extensions/byteplus/live.test.ts index 5facb386df3..03467081b08 100644 --- a/extensions/byteplus/live.test.ts +++ b/extensions/byteplus/live.test.ts @@ -1,10 +1,10 @@ import { completeSimple, type Model } from "@mariozechner/pi-ai"; -import { describe, expect, it } from "vitest"; import { createSingleUserPromptMessage, extractNonEmptyAssistantText, isLiveTestEnabled, -} from "../../src/agents/live-test-helpers.js"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { BYTEPLUS_CODING_BASE_URL, BYTEPLUS_DEFAULT_COST } from "./models.js"; const BYTEPLUS_KEY = process.env.BYTEPLUS_API_KEY ?? ""; diff --git a/extensions/codex/src/app-server/compact.test.ts b/extensions/codex/src/app-server/compact.test.ts index 492fd586f88..59101d40cf2 100644 --- a/extensions/codex/src/app-server/compact.test.ts +++ b/extensions/codex/src/app-server/compact.test.ts @@ -1,8 +1,8 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import type { HarnessContextEngine as ContextEngine } from "openclaw/plugin-sdk/agent-harness-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { ContextEngine } from "../../../../src/context-engine/types.js"; import type { CodexAppServerClient } from "./client.js"; import { maybeCompactCodexAppServerSession, __testing } from "./compact.js"; import type { CodexServerNotification } from "./protocol.js"; diff --git a/extensions/codex/src/app-server/delivery-no-reply-runtime-contract.test.ts b/extensions/codex/src/app-server/delivery-no-reply-runtime-contract.test.ts index f8ef9fad911..c65b7a77a7c 100644 --- a/extensions/codex/src/app-server/delivery-no-reply-runtime-contract.test.ts +++ b/extensions/codex/src/app-server/delivery-no-reply-runtime-contract.test.ts @@ -3,8 +3,8 @@ import os from "node:os"; import path from "node:path"; import { SessionManager } from "@mariozechner/pi-coding-agent"; import type { EmbeddedRunAttemptParams } from "openclaw/plugin-sdk/agent-harness"; +import { isSilentReplyPayloadText } from "openclaw/plugin-sdk/reply-chunking"; import { afterEach, describe, expect, it } from "vitest"; -import { isSilentReplyPayloadText } from "../../../../src/auto-reply/tokens.js"; import { DELIVERY_NO_REPLY_RUNTIME_CONTRACT } from "../../../../test/helpers/agents/delivery-no-reply-runtime-contract.js"; import { CodexAppServerEventProjector } from "./event-projector.js"; import { createCodexTestModel } from "./test-support.js"; diff --git a/extensions/codex/src/app-server/dynamic-tools.test.ts b/extensions/codex/src/app-server/dynamic-tools.test.ts index 476b54869d9..7838f847863 100644 --- a/extensions/codex/src/app-server/dynamic-tools.test.ts +++ b/extensions/codex/src/app-server/dynamic-tools.test.ts @@ -1,14 +1,16 @@ import type { AgentToolResult } from "@mariozechner/pi-agent-core"; import type { AnyAgentTool } from "openclaw/plugin-sdk/agent-harness"; -import { afterEach, describe, expect, it, vi } from "vitest"; -import { wrapToolWithBeforeToolCallHook } from "../../../../src/agents/pi-tools.before-tool-call.js"; +import { wrapToolWithBeforeToolCallHook } from "openclaw/plugin-sdk/agent-harness-runtime"; import { initializeGlobalHookRunner, resetGlobalHookRunner, -} from "../../../../src/plugins/hook-runner-global.js"; -import { createMockPluginRegistry } from "../../../../src/plugins/hooks.test-helpers.js"; -import { createEmptyPluginRegistry } from "../../../../src/plugins/registry.js"; -import { setActivePluginRegistry } from "../../../../src/plugins/runtime.js"; +} from "openclaw/plugin-sdk/hook-runtime"; +import { + createEmptyPluginRegistry, + createMockPluginRegistry, + setActivePluginRegistry, +} from "openclaw/plugin-sdk/testing"; +import { afterEach, describe, expect, it, vi } from "vitest"; import { createCodexDynamicToolBridge } from "./dynamic-tools.js"; import type { JsonValue } from "./protocol.js"; diff --git a/extensions/codex/src/app-server/event-projector.test.ts b/extensions/codex/src/app-server/event-projector.test.ts index 3ceaa739b4f..6044e168ff5 100644 --- a/extensions/codex/src/app-server/event-projector.test.ts +++ b/extensions/codex/src/app-server/event-projector.test.ts @@ -3,13 +3,13 @@ import os from "node:os"; import path from "node:path"; import { SessionManager } from "@mariozechner/pi-coding-agent"; import type { EmbeddedRunAttemptParams } from "openclaw/plugin-sdk/agent-harness"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { resetAgentEventsForTest } from "../../../../src/infra/agent-events.js"; +import { resetAgentEventsForTest } from "openclaw/plugin-sdk/agent-harness-runtime"; import { initializeGlobalHookRunner, resetGlobalHookRunner, -} from "../../../../src/plugins/hook-runner-global.js"; -import { createMockPluginRegistry } from "../../../../src/plugins/hooks.test-helpers.js"; +} from "openclaw/plugin-sdk/hook-runtime"; +import { createMockPluginRegistry } from "openclaw/plugin-sdk/testing"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { CodexAppServerEventProjector, type CodexAppServerToolTelemetry, diff --git a/extensions/codex/src/app-server/openclaw-owned-tool-runtime-contract.test.ts b/extensions/codex/src/app-server/openclaw-owned-tool-runtime-contract.test.ts index d2d56300a77..ed5ddcc6f88 100644 --- a/extensions/codex/src/app-server/openclaw-owned-tool-runtime-contract.test.ts +++ b/extensions/codex/src/app-server/openclaw-owned-tool-runtime-contract.test.ts @@ -1,6 +1,6 @@ import type { AnyAgentTool } from "openclaw/plugin-sdk/agent-harness"; +import { wrapToolWithBeforeToolCallHook } from "openclaw/plugin-sdk/agent-harness-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { wrapToolWithBeforeToolCallHook } from "../../../../src/agents/pi-tools.before-tool-call.js"; import { installCodexToolResultMiddleware, installOpenClawOwnedToolHooks, diff --git a/extensions/codex/src/app-server/outcome-fallback-runtime-contract.test.ts b/extensions/codex/src/app-server/outcome-fallback-runtime-contract.test.ts index c24008f65ef..65790c798fd 100644 --- a/extensions/codex/src/app-server/outcome-fallback-runtime-contract.test.ts +++ b/extensions/codex/src/app-server/outcome-fallback-runtime-contract.test.ts @@ -3,8 +3,8 @@ import os from "node:os"; import path from "node:path"; import { SessionManager } from "@mariozechner/pi-coding-agent"; import type { EmbeddedRunAttemptParams } from "openclaw/plugin-sdk/agent-harness"; +import { classifyEmbeddedPiRunResultForModelFallback } from "openclaw/plugin-sdk/agent-harness-runtime"; import { afterEach, describe, expect, it } from "vitest"; -import { classifyEmbeddedPiRunResultForModelFallback } from "../../../../src/agents/pi-embedded-runner/result-fallback-classifier.js"; import { createContractRunResult, OUTCOME_FALLBACK_RUNTIME_CONTRACT, diff --git a/extensions/codex/src/app-server/run-attempt.context-engine.test.ts b/extensions/codex/src/app-server/run-attempt.context-engine.test.ts index d8402b4d105..090153013a7 100644 --- a/extensions/codex/src/app-server/run-attempt.context-engine.test.ts +++ b/extensions/codex/src/app-server/run-attempt.context-engine.test.ts @@ -4,9 +4,11 @@ import path from "node:path"; import type { AgentMessage } from "@mariozechner/pi-agent-core"; import { SessionManager } from "@mariozechner/pi-coding-agent"; import type { EmbeddedRunAttemptParams } from "openclaw/plugin-sdk/agent-harness"; -import { embeddedAgentLog } from "openclaw/plugin-sdk/agent-harness-runtime"; +import { + embeddedAgentLog, + type HarnessContextEngine as ContextEngine, +} from "openclaw/plugin-sdk/agent-harness-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { ContextEngine } from "../../../../src/context-engine/types.js"; import type { CodexServerNotification } from "./protocol.js"; import { runCodexAppServerAttempt, __testing } from "./run-attempt.js"; import { createCodexTestModel } from "./test-support.js"; @@ -168,16 +170,7 @@ function createStartedThreadHarness( }; } -type MockContextEngine = ContextEngine & { - bootstrap: ReturnType; - assemble: ReturnType; - maintain: ReturnType; - afterTurn?: ReturnType; - ingestBatch?: ReturnType; - ingest?: ReturnType; -}; - -function createContextEngine(overrides: Partial = {}): MockContextEngine { +function createContextEngine(overrides: Partial = {}): ContextEngine { const engine: ContextEngine = { info: { id: "lossless-claw", @@ -199,7 +192,7 @@ function createContextEngine(overrides: Partial = {}): MockContex })), ...overrides, }; - return engine as MockContextEngine; + return engine; } describe("runCodexAppServerAttempt context-engine lifecycle", () => { diff --git a/extensions/codex/src/app-server/run-attempt.test.ts b/extensions/codex/src/app-server/run-attempt.test.ts index cf78c01c3d7..796f8b904e0 100644 --- a/extensions/codex/src/app-server/run-attempt.test.ts +++ b/extensions/codex/src/app-server/run-attempt.test.ts @@ -7,19 +7,19 @@ import { queueAgentHarnessMessage, type EmbeddedRunAttemptParams, } from "openclaw/plugin-sdk/agent-harness"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { __testing as nativeHookRelayTesting } from "../../../../src/agents/harness/native-hook-relay.js"; -import { buildAgentRuntimePlan } from "../../../../src/agents/runtime-plan/build.js"; import { + buildAgentRuntimePlan, + nativeHookRelayTesting, onAgentEvent, resetAgentEventsForTest, type AgentEventPayload, -} from "../../../../src/infra/agent-events.js"; +} from "openclaw/plugin-sdk/agent-harness-runtime"; import { initializeGlobalHookRunner, resetGlobalHookRunner, -} from "../../../../src/plugins/hook-runner-global.js"; -import { createMockPluginRegistry } from "../../../../src/plugins/hooks.test-helpers.js"; +} from "openclaw/plugin-sdk/hook-runtime"; +import { createMockPluginRegistry } from "openclaw/plugin-sdk/testing"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { CODEX_GPT5_BEHAVIOR_CONTRACT } from "../../prompt-overlay.js"; import * as elicitationBridge from "./elicitation-bridge.js"; import type { CodexServerNotification } from "./protocol.js"; diff --git a/extensions/codex/src/app-server/transcript-mirror.test.ts b/extensions/codex/src/app-server/transcript-mirror.test.ts index bdfb720921e..462513997ee 100644 --- a/extensions/codex/src/app-server/transcript-mirror.test.ts +++ b/extensions/codex/src/app-server/transcript-mirror.test.ts @@ -1,17 +1,17 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { afterEach, describe, expect, it } from "vitest"; -import { - castAgentMessage, - makeAgentAssistantMessage, - makeAgentUserMessage, -} from "../../../../src/agents/test-helpers/agent-message-fixtures.js"; import { initializeGlobalHookRunner, resetGlobalHookRunner, -} from "../../../../src/plugins/hook-runner-global.js"; -import { createMockPluginRegistry } from "../../../../src/plugins/hooks.test-helpers.js"; +} from "openclaw/plugin-sdk/hook-runtime"; +import { + castAgentMessage, + createMockPluginRegistry, + makeAgentAssistantMessage, + makeAgentUserMessage, +} from "openclaw/plugin-sdk/testing"; +import { afterEach, describe, expect, it } from "vitest"; import { mirrorCodexAppServerTranscript } from "./transcript-mirror.js"; const tempDirs: string[] = []; diff --git a/extensions/comfy/comfy.live.test.ts b/extensions/comfy/comfy.live.test.ts index 7d8262d973d..1be683bfebf 100644 --- a/extensions/comfy/comfy.live.test.ts +++ b/extensions/comfy/comfy.live.test.ts @@ -1,7 +1,7 @@ +import { resolveOpenClawAgentDir } from "openclaw/plugin-sdk/agent-runtime"; +import { loadConfig } from "openclaw/plugin-sdk/config-runtime"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/testing"; import { beforeAll, describe, expect, it } from "vitest"; -import { resolveOpenClawAgentDir } from "../../src/agents/agent-paths.js"; -import { isLiveTestEnabled } from "../../src/agents/live-test-helpers.js"; -import { loadConfig } from "../../src/config/config.js"; import { createTestPluginApi } from "../../test/helpers/plugins/plugin-api.js"; import plugin from "./index.js"; import { getComfyConfig, isComfyCapabilityConfigured } from "./workflow-runtime.js"; diff --git a/extensions/comfy/index.test.ts b/extensions/comfy/index.test.ts index e0e11f18613..fae7ea616e2 100644 --- a/extensions/comfy/index.test.ts +++ b/extensions/comfy/index.test.ts @@ -1,6 +1,6 @@ import fs from "node:fs"; +import { resolveProviderPluginChoice } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { resolveProviderPluginChoice } from "../../src/plugins/provider-auth-choice.runtime.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; import plugin from "./index.js"; diff --git a/extensions/deepgram/audio.live.test.ts b/extensions/deepgram/audio.live.test.ts index 887ead405ca..85f5b950d92 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 { runRealtimeSttLiveTest, synthesizeElevenLabsLiveSpeech, diff --git a/extensions/deepgram/audio.test.ts b/extensions/deepgram/audio.test.ts index d87da1f2aa7..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.ts"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { transcribeDeepgramAudio } from "./audio.js"; installPinnedHostnameTestHooks(); diff --git a/extensions/deepgram/realtime-transcription-provider.test.ts b/extensions/deepgram/realtime-transcription-provider.test.ts index 54c1100796f..0c263a86b02 100644 --- a/extensions/deepgram/realtime-transcription-provider.test.ts +++ b/extensions/deepgram/realtime-transcription-provider.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../src/config/types.openclaw.js"; import { __testing, buildDeepgramRealtimeTranscriptionProvider, diff --git a/extensions/deepseek/deepseek.live.test.ts b/extensions/deepseek/deepseek.live.test.ts index 62cfc4ed9db..4bb7fa3c58d 100644 --- a/extensions/deepseek/deepseek.live.test.ts +++ b/extensions/deepseek/deepseek.live.test.ts @@ -6,12 +6,12 @@ import { type Context, type Model, } from "@mariozechner/pi-ai"; -import { describe, expect, it } from "vitest"; import { createSingleUserPromptMessage, extractNonEmptyAssistantText, isLiveTestEnabled, -} from "../../src/agents/live-test-helpers.js"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { buildDeepSeekProvider } from "./provider-catalog.js"; import { createDeepSeekV4ThinkingWrapper } from "./stream.js"; diff --git a/extensions/deepseek/index.test.ts b/extensions/deepseek/index.test.ts index 5097e1d4c92..2e0520c521d 100644 --- a/extensions/deepseek/index.test.ts +++ b/extensions/deepseek/index.test.ts @@ -1,8 +1,8 @@ import type { Context, Model } from "@mariozechner/pi-ai"; import { createAssistantMessageEventStream } from "@mariozechner/pi-ai"; +import { buildOpenAICompletionsParams } from "openclaw/plugin-sdk/provider-transport-runtime"; +import { resolveProviderPluginChoice } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { buildOpenAICompletionsParams } from "../../src/agents/openai-transport-stream.js"; -import { resolveProviderPluginChoice } from "../../src/plugins/provider-auth-choice.runtime.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; import { runSingleProviderCatalog } from "../test-support/provider-model-test-helpers.js"; import deepseekPlugin from "./index.js"; diff --git a/extensions/diagnostics-otel/src/service.test.ts b/extensions/diagnostics-otel/src/service.test.ts index 9cfb9dce920..7a0672e32eb 100644 --- a/extensions/diagnostics-otel/src/service.test.ts +++ b/extensions/diagnostics-otel/src/service.test.ts @@ -133,7 +133,7 @@ import { emitTrustedDiagnosticEvent, onInternalDiagnosticEvent, resetDiagnosticEventsForTest, -} from "../../../src/infra/diagnostic-events.js"; +} from "openclaw/plugin-sdk/diagnostic-runtime"; import type { OpenClawPluginServiceContext } from "../api.js"; import { emitDiagnosticEvent } from "../api.js"; import { createDiagnosticsOtelService } from "./service.js"; diff --git a/extensions/diffs/src/config.test.ts b/extensions/diffs/src/config.test.ts index 3c5b1d2e229..9e62494799b 100644 --- a/extensions/diffs/src/config.test.ts +++ b/extensions/diffs/src/config.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import AjvPkg from "ajv"; +import type { JsonSchemaObject } from "openclaw/plugin-sdk/config-schema"; import { describe, expect, it, vi } from "vitest"; -import type { JsonSchemaObject } from "../../../src/shared/json-schema.types.js"; import { DEFAULT_DIFFS_PLUGIN_SECURITY, DEFAULT_DIFFS_TOOL_DEFAULTS, diff --git a/extensions/discord/src/approval-native.test.ts b/extensions/discord/src/approval-native.test.ts index 0470b59d612..89e3d1cd5ec 100644 --- a/extensions/discord/src/approval-native.test.ts +++ b/extensions/discord/src/approval-native.test.ts @@ -1,8 +1,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; +import { clearSessionStoreCacheForTest } from "openclaw/plugin-sdk/session-store-runtime"; import { describe, expect, it } from "vitest"; -import { clearSessionStoreCacheForTest } from "../../../src/config/sessions/store.js"; import { createDiscordNativeApprovalAdapter, getDiscordApprovalCapability, diff --git a/extensions/discord/src/channel.test.ts b/extensions/discord/src/channel.test.ts index 028481b2e41..3554ab56a24 100644 --- a/extensions/discord/src/channel.test.ts +++ b/extensions/discord/src/channel.test.ts @@ -1,7 +1,7 @@ import { readFile } from "node:fs/promises"; import { resolve } from "node:path"; +import type { PluginRuntime } from "openclaw/plugin-sdk/core"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { PluginRuntime } from "../../../src/plugins/runtime/types.js"; 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.proxy.test.ts b/extensions/discord/src/client.proxy.test.ts index 8559936cc7d..ba11f62b5f7 100644 --- a/extensions/discord/src/client.proxy.test.ts +++ b/extensions/discord/src/client.proxy.test.ts @@ -1,7 +1,7 @@ import http from "node:http"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { fetch as undiciFetch } from "undici"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/config.js"; import { createDiscordRestClient } from "./client.js"; import { createDiscordRequestClient } from "./proxy-request-client.js"; diff --git a/extensions/discord/src/monitor/monitor.agent-components.test.ts b/extensions/discord/src/monitor/monitor.agent-components.test.ts index 5bfd6189a11..654b75b77ed 100644 --- a/extensions/discord/src/monitor/monitor.agent-components.test.ts +++ b/extensions/discord/src/monitor/monitor.agent-components.test.ts @@ -1,10 +1,9 @@ import type { ButtonInteraction, ComponentData, StringSelectMenuInteraction } from "@buape/carbon"; import { ChannelType } from "discord-api-types/v10"; -import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; -import type { DiscordAccountConfig } from "openclaw/plugin-sdk/config-types"; +import type { DiscordAccountConfig, OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { buildAgentSessionKey } from "openclaw/plugin-sdk/routing"; +import { peekSystemEvents, resetSystemEventsForTest } from "openclaw/plugin-sdk/testing"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { peekSystemEvents, resetSystemEventsForTest } from "../../../../src/infra/system-events.js"; import { expectPairingReplyText } from "../../../../test/helpers/pairing-reply.js"; import { enqueueSystemEventMock, diff --git a/extensions/discord/src/send.webhook.proxy.test.ts b/extensions/discord/src/send.webhook.proxy.test.ts index 7add863fa4f..784e731249c 100644 --- a/extensions/discord/src/send.webhook.proxy.test.ts +++ b/extensions/discord/src/send.webhook.proxy.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 { sendWebhookMessageDiscord } from "./send.outbound.js"; const makeProxyFetchMock = vi.hoisted(() => vi.fn()); diff --git a/extensions/elevenlabs/elevenlabs.live.test.ts b/extensions/elevenlabs/elevenlabs.live.test.ts index bbcdfcd6606..e3e09b9a1c3 100644 --- a/extensions/elevenlabs/elevenlabs.live.test.ts +++ b/extensions/elevenlabs/elevenlabs.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 { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/elevenlabs/realtime-transcription-provider.test.ts b/extensions/elevenlabs/realtime-transcription-provider.test.ts index 401166ff867..3f011b1d596 100644 --- a/extensions/elevenlabs/realtime-transcription-provider.test.ts +++ b/extensions/elevenlabs/realtime-transcription-provider.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../src/config/types.openclaw.js"; import { __testing, buildElevenLabsRealtimeTranscriptionProvider, diff --git a/extensions/firecrawl/src/firecrawl-tools.test.ts b/extensions/firecrawl/src/firecrawl-tools.test.ts index 3cccccdf7be..4689d372341 100644 --- a/extensions/firecrawl/src/firecrawl-tools.test.ts +++ b/extensions/firecrawl/src/firecrawl-tools.test.ts @@ -1,6 +1,6 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; +import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/testing"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { mockPinnedHostnameResolution } from "../../../src/test-helpers/ssrf.js"; import { DEFAULT_FIRECRAWL_BASE_URL, DEFAULT_FIRECRAWL_MAX_AGE_MS, diff --git a/extensions/fireworks/index.test.ts b/extensions/fireworks/index.test.ts index 3907d6a0186..b866ea4c0a4 100644 --- a/extensions/fireworks/index.test.ts +++ b/extensions/fireworks/index.test.ts @@ -1,6 +1,6 @@ import type { ProviderRuntimeModel } from "openclaw/plugin-sdk/plugin-entry"; +import { resolveProviderPluginChoice } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { resolveProviderPluginChoice } from "../../src/plugins/provider-auth-choice.runtime.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; import { createProviderDynamicModelContext, diff --git a/extensions/github-copilot/index.test.ts b/extensions/github-copilot/index.test.ts index 357142b025d..0d3f2576216 100644 --- a/extensions/github-copilot/index.test.ts +++ b/extensions/github-copilot/index.test.ts @@ -1,11 +1,11 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { afterEach, describe, expect, it, vi } from "vitest"; import { clearRuntimeAuthProfileStoreSnapshots, ensureAuthProfileStore, -} from "../../src/agents/auth-profiles.js"; +} from "openclaw/plugin-sdk/agent-runtime"; +import { afterEach, describe, expect, it, vi } from "vitest"; import { createTestPluginApi } from "../../test/helpers/plugins/plugin-api.js"; const resolveCopilotApiTokenMock = vi.hoisted(() => vi.fn()); diff --git a/extensions/google-meet/google-meet.live.test.ts b/extensions/google-meet/google-meet.live.test.ts index 183c8f07b9d..c0059d10d90 100644 --- a/extensions/google-meet/google-meet.live.test.ts +++ b/extensions/google-meet/google-meet.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 { buildGoogleMeetExportManifest, googleMeetExportFileNames } from "./src/cli.js"; import { fetchGoogleMeetArtifacts, diff --git a/extensions/google/google.live.test.ts b/extensions/google/google.live.test.ts index 5f63845dd59..601a213e301 100644 --- a/extensions/google/google.live.test.ts +++ b/extensions/google/google.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 { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/google/media-understanding-provider.video.test.ts b/extensions/google/media-understanding-provider.video.test.ts index 5af2d6cd669..da3f6a3ecc6 100644 --- a/extensions/google/media-understanding-provider.video.test.ts +++ b/extensions/google/media-understanding-provider.video.test.ts @@ -1,9 +1,9 @@ -import { withFetchPreconnect } from "openclaw/plugin-sdk/testing"; -import { describe, expect, it } from "vitest"; import { createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "../../src/media-understanding/audio.test-helpers.js"; + withFetchPreconnect, +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { describeGeminiVideo, transcribeGeminiAudio } from "./media-understanding-provider.js"; import { resolveGoogleGenerativeAiHttpRequestConfig } from "./runtime-api.js"; diff --git a/extensions/google/web-search-provider.test.ts b/extensions/google/web-search-provider.test.ts index c81d99ce68a..44acb2f8823 100644 --- a/extensions/google/web-search-provider.test.ts +++ b/extensions/google/web-search-provider.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { withEnv } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../src/config/config.js"; import { __testing, createGeminiWebSearchProvider } from "./src/gemini-web-search-provider.js"; describe("google web search provider", () => { diff --git a/extensions/googlechat/src/monitor.webhook-routing.test.ts b/extensions/googlechat/src/monitor.webhook-routing.test.ts index aefe5750532..be07f360c33 100644 --- a/extensions/googlechat/src/monitor.webhook-routing.test.ts +++ b/extensions/googlechat/src/monitor.webhook-routing.test.ts @@ -1,8 +1,7 @@ import { EventEmitter } from "node:events"; import type { IncomingMessage } from "node:http"; +import { createEmptyPluginRegistry, setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createEmptyPluginRegistry } from "../../../src/plugins/registry-empty.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/googlechat/src/secret-contract.test.ts b/extensions/googlechat/src/secret-contract.test.ts index c6d7f941526..7a7b24061d0 100644 --- a/extensions/googlechat/src/secret-contract.test.ts +++ b/extensions/googlechat/src/secret-contract.test.ts @@ -1,10 +1,10 @@ -import { describe, expect, it } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/types.js"; -import { resolveSecretRefValues } from "../../../src/secrets/resolve.js"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { applyResolvedAssignments, createResolverContext, -} from "../../../src/secrets/runtime-shared.js"; + resolveSecretRefValues, +} from "openclaw/plugin-sdk/runtime-secret-resolution"; +import { describe, expect, it } from "vitest"; import { collectRuntimeConfigAssignments } from "./secret-contract.js"; describe("googlechat secret contract", () => { diff --git a/extensions/gradium/gradium.live.test.ts b/extensions/gradium/gradium.live.test.ts index 159056443b4..fd1fc80dcfe 100644 --- a/extensions/gradium/gradium.live.test.ts +++ b/extensions/gradium/gradium.live.test.ts @@ -1,8 +1,8 @@ import { writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; +import { isLiveTestEnabled } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { isLiveTestEnabled } from "../../src/agents/live-test-helpers.js"; import { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/imessage/src/monitor/inbound-processing.test.ts b/extensions/imessage/src/monitor/inbound-processing.test.ts index 1bab96bbae9..73edd838a23 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-types"; +import { sanitizeTerminalText } from "openclaw/plugin-sdk/testing"; import { describe, expect, it, vi } from "vitest"; -import { sanitizeTerminalText } from "../../../../src/terminal/safe-text.js"; import { describeIMessageEchoDropLog, resolveIMessageInboundDecision, diff --git a/extensions/imessage/src/test-plugin.test.ts b/extensions/imessage/src/test-plugin.test.ts index 5c6ec677cda..04227edd0fe 100644 --- a/extensions/imessage/src/test-plugin.test.ts +++ b/extensions/imessage/src/test-plugin.test.ts @@ -1,8 +1,8 @@ -import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { listImportedBundledPluginFacadeIds, resetFacadeRuntimeStateForTest, -} from "../../../src/plugin-sdk/facade-runtime.js"; +} from "openclaw/plugin-sdk/testing"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { createIMessageTestPlugin } from "./imessage.test-plugin.js"; beforeEach(() => { diff --git a/extensions/inworld/inworld.live.test.ts b/extensions/inworld/inworld.live.test.ts index 6cb3736f14b..7bc37cf5fbe 100644 --- a/extensions/inworld/inworld.live.test.ts +++ b/extensions/inworld/inworld.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 { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/memory-core/src/cli.test.ts b/extensions/memory-core/src/cli.test.ts index efeb9a2e71a..39a537d80b1 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 { afterAll, 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 { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { readShortTermRecallEntries, recordShortTermRecalls } from "./short-term-promotion.js"; const getMemorySearchManager = vi.hoisted(() => vi.fn()); diff --git a/extensions/memory-core/src/config.test.ts b/extensions/memory-core/src/config.test.ts index fc02deb8519..f4d6734cd46 100644 --- a/extensions/memory-core/src/config.test.ts +++ b/extensions/memory-core/src/config.test.ts @@ -1,7 +1,6 @@ import fs from "node:fs"; +import { type JsonSchemaObject, validateJsonSchemaValue } from "openclaw/plugin-sdk/config-schema"; import { describe, expect, it } from "vitest"; -import { validateJsonSchemaValue } from "../../../src/plugins/schema-validator.js"; -import type { JsonSchemaObject } from "../../../src/shared/json-schema.types.js"; const manifest = JSON.parse( fs.readFileSync(new URL("../openclaw.plugin.json", import.meta.url), "utf-8"), diff --git a/extensions/memory-core/src/dreaming-narrative.test.ts b/extensions/memory-core/src/dreaming-narrative.test.ts index 3bd36793dc6..acb14a50c0e 100644 --- a/extensions/memory-core/src/dreaming-narrative.test.ts +++ b/extensions/memory-core/src/dreaming-narrative.test.ts @@ -5,11 +5,11 @@ import { RequestScopedSubagentRuntimeError, SUBAGENT_RUNTIME_REQUEST_SCOPE_ERROR_CODE, } from "openclaw/plugin-sdk/error-runtime"; +import { resolveGlobalMap } from "openclaw/plugin-sdk/global-singleton"; import * as memoryCoreHostRuntimeCoreModule from "openclaw/plugin-sdk/memory-core-host-runtime-core"; import * as runtimeConfigSnapshotModule from "openclaw/plugin-sdk/runtime-config-snapshot"; import * as sessionStoreRuntimeModule from "openclaw/plugin-sdk/session-store-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { resolveGlobalMap } from "../../../src/shared/global-singleton.js"; import { appendNarrativeEntry, buildBackfillDiaryEntry, diff --git a/extensions/memory-core/src/memory/embeddings.test.ts b/extensions/memory-core/src/memory/embeddings.test.ts index 92dd01a0cbf..e0ba85670e8 100644 --- a/extensions/memory-core/src/memory/embeddings.test.ts +++ b/extensions/memory-core/src/memory/embeddings.test.ts @@ -1,6 +1,6 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import type { MemoryEmbeddingProviderAdapter } from "openclaw/plugin-sdk/memory-core-host-engine-embeddings"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../../src/config/types.openclaw.js"; import { createEmbeddingProvider } from "./embeddings.js"; const mockEmbeddingRegistry = vi.hoisted(() => ({ diff --git a/extensions/memory-core/src/memory/index.test.ts b/extensions/memory-core/src/memory/index.test.ts index e49870565db..0b693e88ee4 100644 --- a/extensions/memory-core/src/memory/index.test.ts +++ b/extensions/memory-core/src/memory/index.test.ts @@ -3,12 +3,12 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { resolveSessionTranscriptsDirForAgent } from "openclaw/plugin-sdk/memory-core"; -import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { clearMemoryEmbeddingProviders as clearRegistry, listMemoryEmbeddingProviders as listRegisteredAdapters, registerMemoryEmbeddingProvider as registerAdapter, -} from "../../../../src/plugins/memory-embedding-providers.js"; +} from "openclaw/plugin-sdk/memory-core-host-engine-embeddings"; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import "./test-runtime-mocks.js"; import type { MemoryIndexManager } from "./index.js"; import { closeAllMemorySearchManagers, getMemorySearchManager } from "./index.js"; diff --git a/extensions/memory-core/src/memory/manager.watcher-config.test.ts b/extensions/memory-core/src/memory/manager.watcher-config.test.ts index 916756e11e7..a3964dfac35 100644 --- a/extensions/memory-core/src/memory/manager.watcher-config.test.ts +++ b/extensions/memory-core/src/memory/manager.watcher-config.test.ts @@ -64,7 +64,7 @@ vi.mock("./embeddings.js", () => ({ type MemoryIndexModule = typeof import("./index.js"); type MemoryEmbeddingProvidersModule = - typeof import("../../../../src/plugins/memory-embedding-providers.js"); + typeof import("openclaw/plugin-sdk/memory-core-host-engine-embeddings"); let getMemorySearchManager: MemoryIndexModule["getMemorySearchManager"]; let closeAllMemorySearchManagers: MemoryIndexModule["closeAllMemorySearchManagers"]; @@ -82,7 +82,7 @@ describe("memory watcher config", () => { ({ clearMemoryEmbeddingProviders: clearRegistry, registerMemoryEmbeddingProvider: registerAdapter, - } = await import("../../../../src/plugins/memory-embedding-providers.js")); + } = await import("openclaw/plugin-sdk/memory-core-host-engine-embeddings")); }); beforeEach(async () => { diff --git a/extensions/memory-core/src/tools.citations.test.ts b/extensions/memory-core/src/tools.citations.test.ts index c609c9fa9d6..8f8d455cf54 100644 --- a/extensions/memory-core/src/tools.citations.test.ts +++ b/extensions/memory-core/src/tools.citations.test.ts @@ -1,10 +1,10 @@ import fs from "node:fs/promises"; import path from "node:path"; -import { beforeEach, describe, expect, it } from "vitest"; import { clearMemoryPluginState, registerMemoryCorpusSupplement, -} from "../../../src/plugins/memory-state.js"; +} from "openclaw/plugin-sdk/memory-host-core"; +import { beforeEach, describe, expect, it } from "vitest"; import { getMemorySearchManagerMockCalls, getReadAgentMemoryFileMockCalls, diff --git a/extensions/memory-lancedb/config.test.ts b/extensions/memory-lancedb/config.test.ts index 5d9202cb935..6d7069cad5a 100644 --- a/extensions/memory-lancedb/config.test.ts +++ b/extensions/memory-lancedb/config.test.ts @@ -1,7 +1,6 @@ import fs from "node:fs"; +import { type JsonSchemaObject, validateJsonSchemaValue } from "openclaw/plugin-sdk/config-schema"; import { describe, expect, it } from "vitest"; -import { validateJsonSchemaValue } from "../../src/plugins/schema-validator.js"; -import type { JsonSchemaObject } from "../../src/shared/json-schema.types.js"; import { memoryConfigSchema } from "./config.js"; const manifest = JSON.parse( diff --git a/extensions/memory-wiki/cli-metadata.test.ts b/extensions/memory-wiki/cli-metadata.test.ts index f45b2a54e57..83cf06983fa 100644 --- a/extensions/memory-wiki/cli-metadata.test.ts +++ b/extensions/memory-wiki/cli-metadata.test.ts @@ -10,7 +10,7 @@ const mocks = vi.hoisted(() => ({ resolveMemoryWikiConfig: vi.fn(), })); -vi.mock("../../src/config/config.js", () => ({ +vi.mock("openclaw/plugin-sdk/config-runtime", () => ({ getRuntimeConfig: mocks.loadConfig, loadConfig: mocks.loadConfig, })); diff --git a/extensions/memory-wiki/src/bridge.test.ts b/extensions/memory-wiki/src/bridge.test.ts index d56b5240f60..32175987266 100644 --- a/extensions/memory-wiki/src/bridge.test.ts +++ b/extensions/memory-wiki/src/bridge.test.ts @@ -1,16 +1,16 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import type { MemoryPluginPublicArtifact } from "openclaw/plugin-sdk/memory-host-core"; +import { + clearMemoryPluginState, + type MemoryPluginPublicArtifact, + registerMemoryCapability, +} from "openclaw/plugin-sdk/memory-host-core"; import { appendMemoryHostEvent, resolveMemoryHostEventLogPath, } from "openclaw/plugin-sdk/memory-host-events"; import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest"; -import { - clearMemoryPluginState, - registerMemoryCapability, -} from "../../../src/plugins/memory-state.js"; import type { OpenClawConfig } from "../api.js"; import { syncMemoryWikiBridgeSources } from "./bridge.js"; import { createMemoryWikiTestHarness } from "./test-helpers.js"; diff --git a/extensions/memory-wiki/src/config.test.ts b/extensions/memory-wiki/src/config.test.ts index a8394342d90..df04487763d 100644 --- a/extensions/memory-wiki/src/config.test.ts +++ b/extensions/memory-wiki/src/config.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import AjvPkg from "ajv"; +import type { JsonSchemaObject } from "openclaw/plugin-sdk/config-schema"; import { describe, expect, it } from "vitest"; -import type { JsonSchemaObject } from "../../../src/shared/json-schema.types.js"; import { DEFAULT_WIKI_RENDER_MODE, DEFAULT_WIKI_SEARCH_BACKEND, diff --git a/extensions/microsoft/microsoft.live.test.ts b/extensions/microsoft/microsoft.live.test.ts index 35aaa637dcf..1e9918e1cd0 100644 --- a/extensions/microsoft/microsoft.live.test.ts +++ b/extensions/microsoft/microsoft.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 { listMicrosoftVoices } from "./speech-provider.js"; const describeLive = isLiveTestEnabled() ? describe : describe.skip; diff --git a/extensions/migrate-hermes/provider.test.ts b/extensions/migrate-hermes/provider.test.ts index 2819a5ec136..9737518aea2 100644 --- a/extensions/migrate-hermes/provider.test.ts +++ b/extensions/migrate-hermes/provider.test.ts @@ -1,6 +1,6 @@ import path from "node:path"; +import { createCapturedPluginRegistration } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it } from "vitest"; -import { createCapturedPluginRegistration } from "../../src/plugins/captured-registration.js"; import pluginEntry from "./index.js"; import { HERMES_REASON_INCLUDE_SECRETS } from "./items.js"; import { buildHermesMigrationProvider } from "./provider.js"; diff --git a/extensions/minimax/image-generation-provider.test.ts b/extensions/minimax/image-generation-provider.test.ts index 8f3a8f9859b..a17ecb454e6 100644 --- a/extensions/minimax/image-generation-provider.test.ts +++ b/extensions/minimax/image-generation-provider.test.ts @@ -1,6 +1,6 @@ import * as providerAuth from "openclaw/plugin-sdk/provider-auth-runtime"; +import { installPinnedHostnameTestHooks } from "openclaw/plugin-sdk/testing"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { installPinnedHostnameTestHooks } from "../../src/media-understanding/audio.test-helpers.js"; import { buildMinimaxImageGenerationProvider, buildMinimaxPortalImageGenerationProvider, diff --git a/extensions/minimax/minimax.live.test.ts b/extensions/minimax/minimax.live.test.ts index 7ed844cdb62..57ddece57d3 100644 --- a/extensions/minimax/minimax.live.test.ts +++ b/extensions/minimax/minimax.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 { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/mistral/media-understanding-provider.test.ts b/extensions/mistral/media-understanding-provider.test.ts index 0dc82081551..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.ts"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { mistralMediaUnderstandingProvider } from "./media-understanding-provider.js"; installPinnedHostnameTestHooks(); diff --git a/extensions/mistral/mistral.live.test.ts b/extensions/mistral/mistral.live.test.ts index b09e759db35..757c006e0de 100644 --- a/extensions/mistral/mistral.live.test.ts +++ b/extensions/mistral/mistral.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 { normalizeTranscriptForMatch, runRealtimeSttLiveTest, diff --git a/extensions/mistral/realtime-transcription-provider.test.ts b/extensions/mistral/realtime-transcription-provider.test.ts index c0fd6c0cc77..003780a1dd4 100644 --- a/extensions/mistral/realtime-transcription-provider.test.ts +++ b/extensions/mistral/realtime-transcription-provider.test.ts @@ -1,5 +1,5 @@ +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../src/config/types.openclaw.js"; import { __testing, buildMistralRealtimeTranscriptionProvider, diff --git a/extensions/moonshot/media-understanding-provider.test.ts b/extensions/moonshot/media-understanding-provider.test.ts index 725a9675701..425dc07d41e 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.ts"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { describeMoonshotVideo } from "./media-understanding-provider.js"; installPinnedHostnameTestHooks(); diff --git a/extensions/moonshot/moonshot.live.test.ts b/extensions/moonshot/moonshot.live.test.ts index b497fbcf716..07a57ad679d 100644 --- a/extensions/moonshot/moonshot.live.test.ts +++ b/extensions/moonshot/moonshot.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 { createKimiWebSearchProvider } from "./src/kimi-web-search-provider.js"; const KIMI_SEARCH_KEY = diff --git a/extensions/msteams/src/attachments.graph.test.ts b/extensions/msteams/src/attachments.graph.test.ts index 977ba3ad921..65a36b2a5ce 100644 --- a/extensions/msteams/src/attachments.graph.test.ts +++ b/extensions/msteams/src/attachments.graph.test.ts @@ -1,5 +1,5 @@ +import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/testing"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { mockPinnedHostnameResolution } from "../../../src/test-helpers/ssrf.js"; import type { PluginRuntime } from "../runtime-api.js"; import { readRemoteMediaResponse } from "./attachments.test-helpers.js"; import { downloadMSTeamsGraphMedia } from "./attachments/graph.js"; diff --git a/extensions/msteams/src/messenger.test.ts b/extensions/msteams/src/messenger.test.ts index eae2a4566cc..a1cd85674a0 100644 --- a/extensions/msteams/src/messenger.test.ts +++ b/extensions/msteams/src/messenger.test.ts @@ -2,8 +2,8 @@ import { mkdtemp, rm, writeFile } from "node:fs/promises"; import path from "node:path"; import { SILENT_REPLY_TOKEN } from "openclaw/plugin-sdk/reply-chunking"; import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store"; +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 { StoredConversationReference } from "./conversation-store.js"; const graphUploadMockState = vi.hoisted(() => ({ uploadAndShareOneDrive: vi.fn(), diff --git a/extensions/music-generation-providers.live.test.ts b/extensions/music-generation-providers.live.test.ts index 62bd3bbefba..e002aaae4be 100644 --- a/extensions/music-generation-providers.live.test.ts +++ b/extensions/music-generation-providers.live.test.ts @@ -1,20 +1,24 @@ -import { describe, expect, it } from "vitest"; -import { resolveOpenClawAgentDir } from "../src/agents/agent-paths.js"; -import { collectProviderApiKeys } from "../src/agents/live-auth-keys.js"; -import { isLiveProfileKeyModeEnabled, isLiveTestEnabled } from "../src/agents/live-test-helpers.js"; -import { resolveApiKeyForProvider } from "../src/agents/model-auth.js"; -import { loadConfig, type OpenClawConfig } from "../src/config/config.js"; -import { isTruthyEnvValue } from "../src/infra/env.js"; -import { getShellEnvAppliedKeys } from "../src/infra/shell-env.js"; -import { encodePngRgba, fillPixel } from "../src/media/png-encode.js"; +import { + resolveApiKeyForProvider, + resolveOpenClawAgentDir, +} from "openclaw/plugin-sdk/agent-runtime"; +import { loadConfig, type OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { DEFAULT_LIVE_MUSIC_MODELS, + collectProviderApiKeys, + encodePngRgba, + fillPixel, + getShellEnvAppliedKeys, + isLiveProfileKeyModeEnabled, + isLiveTestEnabled, + isTruthyEnvValue, parseCsvFilter, parseProviderModelMap, redactLiveApiKey, resolveConfiguredLiveMusicModels, resolveLiveMusicAuthStore, -} from "../src/music-generation/live-test-helpers.js"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/nvidia/index.test.ts b/extensions/nvidia/index.test.ts index fc2874a7357..2f91e953554 100644 --- a/extensions/nvidia/index.test.ts +++ b/extensions/nvidia/index.test.ts @@ -1,6 +1,6 @@ import fs from "node:fs"; +import { resolveProviderPluginChoice } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { resolveProviderPluginChoice } from "../../src/plugins/provider-auth-choice.runtime.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; import plugin from "./index.js"; diff --git a/extensions/ollama/src/provider-models.test.ts b/extensions/ollama/src/provider-models.test.ts index 5510e516519..67aac923986 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 { buildOllamaModelDefinition, enrichOllamaModelsWithContext, diff --git a/extensions/ollama/src/setup.test.ts b/extensions/ollama/src/setup.test.ts index 15fcc84a129..3d56b61b299 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 { jsonResponse, requestBodyText, requestUrl } from "../../../src/test-helpers/http.js"; import { resetOllamaModelShowInfoCacheForTest } from "./provider-models.js"; import { configureOllamaNonInteractive, diff --git a/extensions/openai/media-understanding-provider.test.ts b/extensions/openai/media-understanding-provider.test.ts index 3e6461ce7b9..a66cadc59f4 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.ts"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { transcribeOpenAiAudio } from "./media-understanding-provider.js"; installPinnedHostnameTestHooks(); diff --git a/extensions/openai/openai-tts.live.test.ts b/extensions/openai/openai-tts.live.test.ts index 6f4df3cfde6..d7cd26d9dfd 100644 --- a/extensions/openai/openai-tts.live.test.ts +++ b/extensions/openai/openai-tts.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 { buildOpenAISpeechProvider } from "./speech-provider.js"; const OPENAI_API_KEY = process.env.OPENAI_API_KEY?.trim() ?? ""; diff --git a/extensions/openshell/src/backend.e2e.test.ts b/extensions/openshell/src/backend.e2e.test.ts index 63a8abb4dbd..64364ae2ff7 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 b3d25985757..a2365a59a8b 100644 --- a/extensions/openshell/src/openshell-core.test.ts +++ b/extensions/openshell/src/openshell-core.test.ts @@ -2,8 +2,8 @@ import nodeFs 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/qa-channel/src/channel.test.ts b/extensions/qa-channel/src/channel.test.ts index 1f9782069f1..a776097b78b 100644 --- a/extensions/qa-channel/src/channel.test.ts +++ b/extensions/qa-channel/src/channel.test.ts @@ -3,8 +3,8 @@ import { resetPluginRuntimeStateForTest, setActivePluginRegistry, } from "openclaw/plugin-sdk/testing"; +import { extractToolPayload } from "openclaw/plugin-sdk/tool-payload"; import { afterEach, describe, expect, it } from "vitest"; -import { extractToolPayload } from "../../../src/infra/outbound/tool-payload.js"; import { createTestRegistry } from "../../../test/helpers/plugins/plugin-registry.js"; import { createStartAccountContext } from "../../../test/helpers/plugins/start-account-context.js"; import { createQaBusState, startQaBusServer } from "../../qa-lab/bus-api.js"; diff --git a/extensions/qianfan/index.test.ts b/extensions/qianfan/index.test.ts index d56f56f5462..91f606de58b 100644 --- a/extensions/qianfan/index.test.ts +++ b/extensions/qianfan/index.test.ts @@ -1,6 +1,6 @@ import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard"; +import { resolveProviderPluginChoice } from "openclaw/plugin-sdk/testing"; import { describe, expect, it } from "vitest"; -import { resolveProviderPluginChoice } from "../../src/plugins/provider-auth-choice.runtime.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; import { runSingleProviderCatalog } from "../test-support/provider-model-test-helpers.js"; import qianfanPlugin from "./index.js"; diff --git a/extensions/qqbot/src/config.test.ts b/extensions/qqbot/src/config.test.ts index c7fcbc72be5..cf7da2b4b29 100644 --- a/extensions/qqbot/src/config.test.ts +++ b/extensions/qqbot/src/config.test.ts @@ -1,8 +1,7 @@ import fs from "node:fs"; +import { type JsonSchemaObject, validateJsonSchemaValue } from "openclaw/plugin-sdk/config-schema"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { describe, expect, it } from "vitest"; -import { validateJsonSchemaValue } from "../../../src/plugins/schema-validator.js"; -import type { JsonSchemaObject } from "../../../src/shared/json-schema.types.js"; import { qqbotSetupAdapterShared } from "./bridge/config-shared.js"; import { DEFAULT_ACCOUNT_ID, diff --git a/extensions/qqbot/src/manifest-schema.test.ts b/extensions/qqbot/src/manifest-schema.test.ts index 19657bd3cb9..a99f4a65f2b 100644 --- a/extensions/qqbot/src/manifest-schema.test.ts +++ b/extensions/qqbot/src/manifest-schema.test.ts @@ -1,6 +1,6 @@ import fs from "node:fs"; +import { validateJsonSchemaValue } from "openclaw/plugin-sdk/config-schema"; import { describe, expect, it } from "vitest"; -import { validateJsonSchemaValue } from "../../../src/plugins/schema-validator.js"; const manifest = JSON.parse( fs.readFileSync(new URL("../openclaw.plugin.json", import.meta.url), "utf-8"), diff --git a/extensions/qwen/media-understanding-provider.test.ts b/extensions/qwen/media-understanding-provider.test.ts index a1e9505387c..9eb618be86b 100644 --- a/extensions/qwen/media-understanding-provider.test.ts +++ b/extensions/qwen/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 { describeQwenVideo } from "./media-understanding-provider.js"; installPinnedHostnameTestHooks(); diff --git a/extensions/senseaudio/media-understanding-provider.test.ts b/extensions/senseaudio/media-understanding-provider.test.ts index 0e175a53730..45ba23af961 100644 --- a/extensions/senseaudio/media-understanding-provider.test.ts +++ b/extensions/senseaudio/media-understanding-provider.test.ts @@ -3,12 +3,12 @@ import { mkdtempSync, readFileSync, rmSync } from "node:fs"; import os from "node:os"; import path from "node:path"; import { runFfmpeg } from "openclaw/plugin-sdk/media-runtime"; -import { describe, expect, it } from "vitest"; import { createAuthCaptureJsonFetch, createRequestCaptureJsonFetch, installPinnedHostnameTestHooks, -} from "../../src/media-understanding/audio.test-helpers.ts"; +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { transcribeSenseAudioAudio } from "./media-understanding-provider.js"; installPinnedHostnameTestHooks(); 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 b74a1fd4b5b..eca2eacd095 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-types"; import type { MsgContext } from "openclaw/plugin-sdk/reply-runtime"; +import { buildDispatchInboundCaptureMock } from "openclaw/plugin-sdk/testing"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { buildDispatchInboundCaptureMock } from "../../../../src/channels/plugins/contracts/inbound-testkit.js"; type SignalMsgContext = Pick & { Body?: string; diff --git a/extensions/slack/src/approval-native.test.ts b/extensions/slack/src/approval-native.test.ts index 0e3d6df6b0f..db1cea43239 100644 --- a/extensions/slack/src/approval-native.test.ts +++ b/extensions/slack/src/approval-native.test.ts @@ -2,8 +2,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; +import { clearSessionStoreCacheForTest } from "openclaw/plugin-sdk/session-store-runtime"; import { describe, expect, it } from "vitest"; -import { clearSessionStoreCacheForTest } from "../../../src/config/sessions/store.js"; import { slackApprovalCapability, slackNativeApprovalAdapter } from "./approval-native.js"; function buildConfig( diff --git a/extensions/telegram/src/approval-native.test.ts b/extensions/telegram/src/approval-native.test.ts index 53c2056eced..0a7e9219ca5 100644 --- a/extensions/telegram/src/approval-native.test.ts +++ b/extensions/telegram/src/approval-native.test.ts @@ -2,8 +2,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; +import { clearSessionStoreCacheForTest } from "openclaw/plugin-sdk/session-store-runtime"; import { describe, expect, it } from "vitest"; -import { clearSessionStoreCacheForTest } from "../../../src/config/sessions/store.js"; import { telegramApprovalCapability, telegramNativeApprovalAdapter } from "./approval-native.js"; function buildConfig( diff --git a/extensions/telegram/src/bot-message-dispatch.test.ts b/extensions/telegram/src/bot-message-dispatch.test.ts index 6eddb5f7207..067af5d3499 100644 --- a/extensions/telegram/src/bot-message-dispatch.test.ts +++ b/extensions/telegram/src/bot-message-dispatch.test.ts @@ -1,6 +1,6 @@ import type { Bot } from "grammy"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { OpenClawConfig } from "../../../src/config/types.openclaw.js"; import { resolveAutoTopicLabelConfig as resolveAutoTopicLabelConfigRuntime } from "./auto-topic-label-config.js"; import type { TelegramBotDeps } from "./bot-deps.js"; import { diff --git a/extensions/telegram/src/bot-native-commands.registry.test.ts b/extensions/telegram/src/bot-native-commands.registry.test.ts index 7f9cbf465d5..286b9ce370b 100644 --- a/extensions/telegram/src/bot-native-commands.registry.test.ts +++ b/extensions/telegram/src/bot-native-commands.registry.test.ts @@ -4,7 +4,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; let registerTelegramNativeCommands: typeof import("./bot-native-commands.js").registerTelegramNativeCommands; let clearPluginCommands: typeof import("../../../src/plugins/commands.js").clearPluginCommands; let registerPluginCommand: typeof import("../../../src/plugins/commands.js").registerPluginCommand; -let setActivePluginRegistry: typeof import("../../../src/plugins/runtime.js").setActivePluginRegistry; +let setActivePluginRegistry: typeof import("openclaw/plugin-sdk/testing").setActivePluginRegistry; let createCommandBot: typeof import("./bot-native-commands.menu-test-support.js").createCommandBot; let createNativeCommandTestParams: typeof import("./bot-native-commands.menu-test-support.js").createNativeCommandTestParams; let createPrivateCommandContext: typeof import("./bot-native-commands.menu-test-support.js").createPrivateCommandContext; @@ -115,7 +115,7 @@ describe("registerTelegramNativeCommands real plugin registry", () => { beforeAll(async () => { ({ clearPluginCommands, registerPluginCommand } = await import("../../../src/plugins/commands.js")); - ({ setActivePluginRegistry } = await import("../../../src/plugins/runtime.js")); + ({ setActivePluginRegistry } = await import("openclaw/plugin-sdk/testing")); ({ registerTelegramNativeCommands } = await import("./bot-native-commands.js")); ({ createCommandBot, diff --git a/extensions/telegram/src/bot.test.ts b/extensions/telegram/src/bot.test.ts index 27c08d9c6a3..78cc4e78ef9 100644 --- a/extensions/telegram/src/bot.test.ts +++ b/extensions/telegram/src/bot.test.ts @@ -4,8 +4,8 @@ import { clearPluginInteractiveHandlers, registerPluginInteractiveHandler, } from "openclaw/plugin-sdk/plugin-runtime"; +import { mockPinnedHostnameResolution } from "openclaw/plugin-sdk/testing"; import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { mockPinnedHostnameResolution } from "../../../src/test-helpers/ssrf.js"; import type { TelegramInteractiveHandlerContext } from "./interactive-dispatch.js"; const { answerCallbackQuerySpy, diff --git a/extensions/telegram/src/bot/delivery.resolve-media-retry.test.ts b/extensions/telegram/src/bot/delivery.resolve-media-retry.test.ts index 05618177af3..6e0b9ebfe77 100644 --- a/extensions/telegram/src/bot/delivery.resolve-media-retry.test.ts +++ b/extensions/telegram/src/bot/delivery.resolve-media-retry.test.ts @@ -1,6 +1,6 @@ import type { Message } from "@grammyjs/types"; +import { retryAsync } from "openclaw/plugin-sdk/retry-runtime"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { retryAsync } from "../../../../src/infra/retry.js"; import { resolveMedia } from "./delivery.resolve-media.js"; import type { TelegramContext } from "./types.js"; diff --git a/extensions/telegram/src/bot/delivery.test.ts b/extensions/telegram/src/bot/delivery.test.ts index e7f194fa5e3..cc06e72c839 100644 --- a/extensions/telegram/src/bot/delivery.test.ts +++ b/extensions/telegram/src/bot/delivery.test.ts @@ -24,27 +24,26 @@ type DeliverWithParams = Omit< Partial>; type RuntimeStub = Pick; -vi.mock("openclaw/plugin-sdk/web-media", () => ({ - loadWebMedia: (...args: unknown[]) => loadWebMedia(...args), -})); vi.mock("openclaw/plugin-sdk/web-media", () => ({ loadWebMedia: (...args: unknown[]) => loadWebMedia(...args), })); -vi.mock("../../../../src/plugins/hook-runner-global.js", () => ({ - getGlobalHookRunner: () => messageHookRunner, -})); - -vi.mock("../../../../src/hooks/internal-hooks.js", async () => { - const actual = await vi.importActual( - "../../../../src/hooks/internal-hooks.js", - ); +vi.mock("openclaw/plugin-sdk/hook-runtime", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, triggerInternalHook, }; }); +vi.mock("openclaw/plugin-sdk/plugin-runtime", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getGlobalHookRunner: () => messageHookRunner, + }; +}); + vi.resetModules(); const { deliverReplies } = await import("./delivery.js"); diff --git a/extensions/telegram/src/token.test.ts b/extensions/telegram/src/token.test.ts index 54596e2a8e5..67b34073153 100644 --- a/extensions/telegram/src/token.test.ts +++ b/extensions/telegram/src/token.test.ts @@ -2,8 +2,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types"; +import { withStateDirEnv } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -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/video-generation-providers.live.test.ts b/extensions/video-generation-providers.live.test.ts index f1b4c122556..a56bf8e50ea 100644 --- a/extensions/video-generation-providers.live.test.ts +++ b/extensions/video-generation-providers.live.test.ts @@ -1,40 +1,40 @@ -import { describe, expect, it } from "vitest"; -import { resolveOpenClawAgentDir } from "../src/agents/agent-paths.js"; -import { collectProviderApiKeys } from "../src/agents/live-auth-keys.js"; -import { isModelNotFoundErrorMessage } from "../src/agents/live-model-errors.js"; -import { isLiveProfileKeyModeEnabled, isLiveTestEnabled } from "../src/agents/live-test-helpers.js"; -import { resolveApiKeyForProvider } from "../src/agents/model-auth.js"; import { + resolveApiKeyForProvider, + resolveOpenClawAgentDir, +} from "openclaw/plugin-sdk/agent-runtime"; +import { loadConfig, type OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { + DEFAULT_LIVE_VIDEO_MODELS, + canRunBufferBackedImageToVideoLiveLane, + canRunBufferBackedVideoToVideoLiveLane, + collectProviderApiKeys, + encodePngRgba, + fillPixel, + getShellEnvAppliedKeys, + isLiveProfileKeyModeEnabled, + isLiveTestEnabled, + isModelNotFoundErrorMessage, + isTruthyEnvValue, isAuthErrorMessage, isBillingErrorMessage, isOverloadedErrorMessage, isServerErrorMessage, isTimeoutErrorMessage, -} from "../src/agents/pi-embedded-helpers/failover-matches.js"; -import { loadConfig, type OpenClawConfig } from "../src/config/config.js"; -import { isTruthyEnvValue } from "../src/infra/env.js"; -import { getShellEnvAppliedKeys } from "../src/infra/shell-env.js"; -import { encodePngRgba, fillPixel } from "../src/media/png-encode.js"; -import { normalizeVideoGenerationDuration } from "../src/video-generation/duration-support.js"; -import { - canRunBufferBackedImageToVideoLiveLane, - canRunBufferBackedVideoToVideoLiveLane, - DEFAULT_LIVE_VIDEO_MODELS, + normalizeVideoGenerationDuration, parseCsvFilter, parseProviderModelMap, + parseVideoGenerationModelRef, redactLiveApiKey, resolveConfiguredLiveVideoModels, resolveLiveVideoAuthStore, resolveLiveVideoResolution, -} from "../src/video-generation/live-test-helpers.js"; -import { parseVideoGenerationModelRef } from "../src/video-generation/model-ref.js"; -import type { - GeneratedVideoAsset, - VideoGenerationMode, - VideoGenerationModeCapabilities, - VideoGenerationProvider, - VideoGenerationRequest, -} from "../src/video-generation/types.js"; + type GeneratedVideoAsset, + type VideoGenerationMode, + type VideoGenerationModeCapabilities, + type VideoGenerationProvider, + type VideoGenerationRequest, +} from "openclaw/plugin-sdk/testing"; +import { describe, expect, it } from "vitest"; import { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/vydra/vydra.live.test.ts b/extensions/vydra/vydra.live.test.ts index a876808b31e..99f8f694525 100644 --- a/extensions/vydra/vydra.live.test.ts +++ b/extensions/vydra/vydra.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 { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/xiaomi/xiaomi.live.test.ts b/extensions/xiaomi/xiaomi.live.test.ts index bd617589306..eade68a935d 100644 --- a/extensions/xiaomi/xiaomi.live.test.ts +++ b/extensions/xiaomi/xiaomi.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 { registerProviderPlugin, requireRegisteredProvider, diff --git a/extensions/zai/index.test.ts b/extensions/zai/index.test.ts index cbf76c05ba8..a8d6deca02b 100644 --- a/extensions/zai/index.test.ts +++ b/extensions/zai/index.test.ts @@ -1,7 +1,7 @@ import type { StreamFn } from "@mariozechner/pi-agent-core"; import type { Context, Model } from "@mariozechner/pi-ai"; +import { buildOpenAICompletionsParams } from "openclaw/plugin-sdk/provider-transport-runtime"; import { describe, expect, it } from "vitest"; -import { buildOpenAICompletionsParams } from "../../src/agents/openai-transport-stream.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; import plugin from "./index.js"; diff --git a/extensions/zalo/src/monitor.lifecycle.test.ts b/extensions/zalo/src/monitor.lifecycle.test.ts index 688a67b0d15..19d0a99596c 100644 --- a/extensions/zalo/src/monitor.lifecycle.test.ts +++ b/extensions/zalo/src/monitor.lifecycle.test.ts @@ -1,6 +1,5 @@ +import { createEmptyPluginRegistry, setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createEmptyPluginRegistry } from "../../../src/plugins/registry-empty.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.polling.media-reply.test.ts b/extensions/zalo/src/monitor.polling.media-reply.test.ts index 5cbec6781a3..da9bf221bcc 100644 --- a/extensions/zalo/src/monitor.polling.media-reply.test.ts +++ b/extensions/zalo/src/monitor.polling.media-reply.test.ts @@ -1,6 +1,5 @@ +import { createEmptyPluginRegistry, setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; import { afterAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { createEmptyPluginRegistry } from "../../../src/plugins/registry-empty.js"; -import { setActivePluginRegistry } from "../../../src/plugins/runtime.js"; import { createRuntimeEnv } from "../../../test/helpers/plugins/runtime-env.js"; import type { PluginRuntime } from "../runtime-api.js"; import { diff --git a/extensions/zalo/src/monitor.webhook.test.ts b/extensions/zalo/src/monitor.webhook.test.ts index eec052842a0..3a8db757e84 100644 --- a/extensions/zalo/src/monitor.webhook.test.ts +++ b/extensions/zalo/src/monitor.webhook.test.ts @@ -1,7 +1,6 @@ import type { RequestListener } from "node:http"; +import { createEmptyPluginRegistry, setActivePluginRegistry } from "openclaw/plugin-sdk/testing"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createEmptyPluginRegistry } from "../../../src/plugins/registry-empty.js"; -import { setActivePluginRegistry } from "../../../src/plugins/runtime.js"; import { withServer } from "../../../test/helpers/http-test-server.js"; import type { OpenClawConfig, PluginRuntime } from "../runtime-api.js"; import {