Extension host: organize foundation modules

This commit is contained in:
Gustavo Madeira Santana 2026-03-16 00:24:19 +00:00
parent 67ca7cc1d8
commit 1ea8fc0db6
145 changed files with 557 additions and 1946 deletions

BIN
src/agents/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -14,8 +14,15 @@ import {
} from "./agent-scope.js";
import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "./defaults.js";
import type { ModelCatalogEntry } from "./model-catalog.js";
import { normalizeGoogleModelId } from "./model-id-normalization.js";
import { splitTrailingAuthProfile } from "./model-ref-profile.js";
import {
legacyModelKey,
modelKey,
normalizeModelRef,
parseModelRef,
type ModelRef,
} from "./model-ref.js";
import { normalizeProviderId, normalizeProviderIdForAuth } from "./provider-id.js";
const log = createSubsystemLogger("model-selection");
@ -588,3 +595,13 @@ export function normalizeModelSelection(value: unknown): string | undefined {
}
return undefined;
}
export {
legacyModelKey,
modelKey,
normalizeModelRef,
normalizeProviderId,
normalizeProviderIdForAuth,
parseModelRef,
};
export type { ModelRef };

BIN
src/agents/pi-embedded-runner/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -4,7 +4,7 @@ import type { OpenClawConfig } from "../../config/config.js";
import {
loadResolvedExtensionRegistry,
type ResolvedExtensionRegistry,
} from "../../extension-host/resolved-registry.js";
} from "../../extension-host/manifests/resolved-registry.js";
import { createSubsystemLogger } from "../../logging/subsystem.js";
import {
normalizePluginsConfig,

BIN
src/auto-reply/.DS_Store vendored Normal file

Binary file not shown.

BIN
src/auto-reply/reply/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -8,7 +8,7 @@
import {
executeExtensionHostPluginCommand,
matchExtensionHostPluginCommand,
} from "../../extension-host/command-runtime.js";
} from "../../extension-host/contributions/command-runtime.js";
import type { CommandHandler, CommandHandlerResult } from "./commands-types.js";
/**

View File

@ -20,7 +20,7 @@ import {
type SessionEntry,
type SessionScope,
} from "../config/sessions.js";
import { listExtensionHostPluginCommands } from "../extension-host/command-runtime.js";
import { listExtensionHostPluginCommands } from "../extension-host/contributions/command-runtime.js";
import { formatTimeAgo } from "../infra/format-time/format-relative.ts";
import { resolveCommitHash } from "../infra/git-commit.js";
import type { MediaUnderstandingDecision } from "../media-understanding/types.js";
@ -799,7 +799,7 @@ type CommandsListItem = {
function buildCommandItems(
commands: ChatCommandDefinition[],
pluginCommands: ReturnType<typeof listPluginCommands>,
pluginCommands: ReturnType<typeof listExtensionHostPluginCommands>,
): CommandsListItem[] {
const grouped = groupCommandsByCategory(commands);
const items: CommandsListItem[] = [];

BIN
src/channels/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -8,8 +8,8 @@ import {
resolveChannelGroupRequireMention,
resolveChannelGroupToolsPolicy,
} from "../config/group-policy.js";
import { requireActiveExtensionHostRegistry } from "../extension-host/active-registry.js";
import { listExtensionHostChannelRegistrations } from "../extension-host/runtime-registry.js";
import { listExtensionHostChannelRegistrations } from "../extension-host/contributions/runtime-registry.js";
import { requireActiveExtensionHostRegistry } from "../extension-host/static/active-registry.js";
import {
formatAllowFromLowercase,
formatNormalizedAllowFromEntries,

BIN
src/channels/plugins/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -4,7 +4,7 @@ import {
getExtensionPackageMetadata,
type OpenClawPackageManifest,
type PackageManifest,
} from "../../extension-host/schema.js";
} from "../../extension-host/manifests/schema.js";
import { discoverOpenClawPlugins } from "../../plugins/discovery.js";
import type { PluginOrigin } from "../../plugins/types.js";
import { isRecord, resolveConfigDir, resolveUserPath } from "../../utils.js";

View File

@ -1,8 +1,8 @@
import { listExtensionHostChannelRegistrations } from "../../extension-host/contributions/runtime-registry.js";
import {
getActiveExtensionHostRegistryVersion,
requireActiveExtensionHostRegistry,
} from "../../extension-host/active-registry.js";
import { listExtensionHostChannelRegistrations } from "../../extension-host/runtime-registry.js";
} from "../../extension-host/static/active-registry.js";
import { CHAT_CHANNEL_ORDER, type ChatChannelId, normalizeAnyChannelId } from "../registry.js";
import type { ChannelId, ChannelPlugin } from "./types.js";

View File

@ -10,7 +10,7 @@ import type { SlackProbe } from "../../../extensions/slack/src/probe.js";
import type { TelegramProbe } from "../../../extensions/telegram/src/probe.js";
import type { TelegramTokenResolution } from "../../../extensions/telegram/src/token.js";
import type { OpenClawConfig } from "../../config/config.js";
import { addExtensionHostChannelRegistration } from "../../extension-host/runtime-registry.js";
import { addExtensionHostChannelRegistration } from "../../extension-host/contributions/runtime-registry.js";
import type { LineProbeResult } from "../../line/types.js";
import { setActivePluginRegistry } from "../../plugins/runtime.js";
import {

View File

@ -1,5 +1,5 @@
import { getActiveExtensionHostRegistry } from "../../extension-host/active-registry.js";
import { listExtensionHostChannelRegistrations } from "../../extension-host/runtime-registry.js";
import { listExtensionHostChannelRegistrations } from "../../extension-host/contributions/runtime-registry.js";
import { getActiveExtensionHostRegistry } from "../../extension-host/static/active-registry.js";
import type { PluginChannelRegistration, PluginRegistry } from "../../plugins/registry.js";
import type { ChannelId } from "./types.js";

View File

@ -1,5 +1,5 @@
import { requireActiveExtensionHostRegistry } from "../extension-host/active-registry.js";
import { listExtensionHostChannelRegistrations } from "../extension-host/runtime-registry.js";
import { listExtensionHostChannelRegistrations } from "../extension-host/contributions/runtime-registry.js";
import { requireActiveExtensionHostRegistry } from "../extension-host/static/active-registry.js";
import type { ChannelMeta } from "./plugins/types.js";
import type { ChannelId } from "./plugins/types.js";

BIN
src/cli/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -1,6 +1,6 @@
import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js";
import { loadConfig } from "../config/config.js";
import { hasExtensionHostRuntimeEntries } from "../extension-host/runtime-registry.js";
import { hasExtensionHostRuntimeEntries } from "../extension-host/contributions/runtime-registry.js";
import { createSubsystemLogger } from "../logging.js";
import { loadOpenClawPlugins } from "../plugins/loader.js";
import { getActivePluginRegistry } from "../plugins/runtime.js";

BIN
src/commands/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -20,7 +20,7 @@ const runExtensionHostProviderModelSelectedHook = vi.hoisted(() => vi.fn(async (
vi.mock("../plugins/provider-wizard.js", () => ({
resolveProviderPluginChoice,
}));
vi.mock("../extension-host/provider-model-selection.js", () => ({
vi.mock("../extension-host/contributions/provider-model-selection.js", () => ({
runExtensionHostProviderModelSelectedHook,
}));

View File

@ -3,7 +3,7 @@ import {
applyExtensionHostPluginProvider,
runExtensionHostProviderAuthMethod,
type ExtensionHostPluginProviderAuthChoiceOptions,
} from "../extension-host/provider-auth-flow.js";
} from "../extension-host/contributions/provider-auth-flow.js";
import type { ApplyAuthChoiceParams, ApplyAuthChoiceResult } from "./auth-choice.apply.js";
export type PluginProviderAuthChoiceOptions = ExtensionHostPluginProviderAuthChoiceOptions;

View File

@ -401,7 +401,7 @@ export async function promptDefaultModel(
workspaceDir: params.workspaceDir,
});
if (applied.defaultModel) {
await runExtensionHostProviderModelSelectedHook({
await runProviderModelSelectedHook({
config: applied.config,
model: applied.defaultModel,
prompter: params.prompter,

Binary file not shown.

View File

@ -4,7 +4,7 @@ import {
mergeExtensionHostConfigPatch,
pickExtensionHostAuthMethod,
resolveExtensionHostProviderMatch,
} from "../extension-host/provider-auth.js";
} from "../extension-host/contributions/provider-auth.js";
import type { ProviderAuthMethod, ProviderPlugin } from "../plugins/types.js";
export function resolveProviderMatch(

BIN
src/config/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -6,7 +6,7 @@ import type { ChannelPlugin } from "../channels/plugins/index.js";
import {
loadResolvedExtensionRegistry,
type ResolvedExtensionRegistry,
} from "../extension-host/resolved-registry.js";
} from "../extension-host/manifests/resolved-registry.js";
import { resolveOpenClawPackageRootSync } from "../infra/openclaw-root.js";
import { FIELD_HELP } from "./schema.help.js";
import { buildConfigSchema, type ConfigSchemaResponse } from "./schema.js";

View File

@ -13,7 +13,7 @@ import {
loadResolvedExtensionRegistry,
resolvedExtensionRegistryFromPluginManifestRegistry,
type ResolvedExtensionRegistry,
} from "../extension-host/resolved-registry.js";
} from "../extension-host/manifests/resolved-registry.js";
import { type PluginManifestRegistry } from "../plugins/manifest-registry.js";
import { isRecord } from "../utils.js";
import type { OpenClawConfig } from "./config.js";

View File

@ -1,8 +1,9 @@
import type { ResolvedExtensionRegistry } from "../extension-host/resolved-registry.js";
import type { ResolvedExtensionRegistry } from "../extension-host/manifests/resolved-registry.js";
export type ResolvedExtensionValidationEntry = {
id: string;
origin: "workspace" | "bundled" | "global" | "config";
format?: "bundle" | "openclaw";
kind?: string;
channels: string[];
configSchema?: Record<string, unknown>;
@ -37,6 +38,7 @@ export function buildResolvedExtensionValidationIndex(
return {
id: extension.id,
origin: extension.origin ?? "workspace",
format: record.manifestPath.endsWith("package.json") ? "openclaw" : "bundle",
kind: extension.kind,
channels,
configSchema: extension.staticMetadata.configSchema,

View File

@ -1,7 +1,7 @@
import path from "node:path";
import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js";
import { CHANNEL_IDS, normalizeChatChannelId } from "../channels/registry.js";
import { loadResolvedExtensionRegistry } from "../extension-host/resolved-registry.js";
import { loadResolvedExtensionRegistry } from "../extension-host/manifests/resolved-registry.js";
import {
normalizePluginsConfig,
resolveEffectiveEnableState,

BIN
src/extension-host/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -5,7 +5,7 @@ import { activateExtensionHostRegistry } from "./activation.js";
import {
getActiveExtensionHostRegistry,
getActiveExtensionHostRegistryKey,
} from "./active-registry.js";
} from "./static/active-registry.js";
describe("extension host activation", () => {
beforeEach(() => {

View File

@ -1,6 +1,6 @@
import { initializeGlobalHookRunner } from "../plugins/hook-runner-global.js";
import type { PluginRegistry } from "../plugins/registry.js";
import { setActiveExtensionHostRegistry } from "./active-registry.js";
import { setActiveExtensionHostRegistry } from "./static/active-registry.js";
export function activateExtensionHostRegistry(registry: PluginRegistry, cacheKey: string): void {
setActiveExtensionHostRegistry(registry, cacheKey);

View File

@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { createEmptyPluginRegistry } from "../plugins/registry.js";
import { createEmptyPluginRegistry } from "../../plugins/registry.js";
import { bootstrapExtensionHostPluginLoad } from "./loader-bootstrap.js";
describe("extension host loader bootstrap", () => {

View File

@ -1,20 +1,20 @@
import type { OpenClawConfig } from "../config/config.js";
import type { NormalizedPluginsConfig } from "../plugins/config-state.js";
import { discoverOpenClawPlugins, type PluginCandidate } from "../plugins/discovery.js";
import type { OpenClawConfig } from "../../config/config.js";
import type { NormalizedPluginsConfig } from "../../plugins/config-state.js";
import { discoverOpenClawPlugins, type PluginCandidate } from "../../plugins/discovery.js";
import {
loadPluginManifestRegistry,
type PluginManifestRecord,
type PluginManifestRegistry,
} from "../plugins/manifest-registry.js";
import type { PluginRegistry } from "../plugins/registry.js";
import type { PluginLogger } from "../plugins/types.js";
import { resolveExtensionHostDiscoveryPolicy } from "./loader-discovery-policy.js";
} from "../../plugins/manifest-registry.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import type { PluginLogger } from "../../plugins/types.js";
import { resolveExtensionHostDiscoveryPolicy } from "../policy/loader-discovery-policy.js";
import {
buildExtensionHostProvenanceIndex,
compareExtensionHostDuplicateCandidateOrder,
pushExtensionHostDiagnostics,
} from "./loader-policy.js";
import type { ExtensionHostProvenanceIndex } from "./loader-provenance.js";
} from "../policy/loader-policy.js";
import type { ExtensionHostProvenanceIndex } from "../policy/loader-provenance.js";
export function bootstrapExtensionHostPluginLoad(params: {
config: OpenClawConfig;

View File

@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import type { PluginRegistry } from "../plugins/registry.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import {
buildExtensionHostRegistryCacheKey,
clearExtensionHostRegistryCache,

View File

@ -1,8 +1,8 @@
import type { PluginInstallRecord } from "../config/types.plugins.js";
import type { NormalizedPluginsConfig } from "../plugins/config-state.js";
import type { PluginRegistry } from "../plugins/registry.js";
import { resolvePluginCacheInputs } from "../plugins/roots.js";
import { resolveUserPath } from "../utils.js";
import type { PluginInstallRecord } from "../../config/types.plugins.js";
import type { NormalizedPluginsConfig } from "../../plugins/config-state.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import { resolvePluginCacheInputs } from "../../plugins/roots.js";
import { resolveUserPath } from "../../utils.js";
export const MAX_EXTENSION_HOST_REGISTRY_CACHE_ENTRIES = 32;

View File

@ -1,17 +1,17 @@
import type { OpenClawConfig } from "../config/config.js";
import type { NormalizedPluginsConfig } from "../plugins/config-state.js";
import { createPluginRegistry, type PluginRegistry } from "../plugins/registry.js";
import type { CreatePluginRuntimeOptions } from "../plugins/runtime/index.js";
import type { PluginRuntime } from "../plugins/runtime/types.js";
import type { PluginLogger } from "../plugins/types.js";
import { bootstrapExtensionHostPluginLoad } from "./loader-bootstrap.js";
import { resolveExtensionHostDiscoveryPolicy } from "./loader-discovery-policy.js";
import { createExtensionHostModuleLoader } from "./loader-module-loader.js";
import type { OpenClawConfig } from "../../config/config.js";
import type { NormalizedPluginsConfig } from "../../plugins/config-state.js";
import { createPluginRegistry, type PluginRegistry } from "../../plugins/registry.js";
import type { CreatePluginRuntimeOptions } from "../../plugins/runtime/index.js";
import type { PluginRuntime } from "../../plugins/runtime/types.js";
import type { PluginLogger } from "../../plugins/types.js";
import { resolveExtensionHostDiscoveryPolicy } from "../policy/loader-discovery-policy.js";
import {
buildExtensionHostProvenanceIndex,
compareExtensionHostDuplicateCandidateOrder,
pushExtensionHostDiagnostics,
} from "./loader-policy.js";
} from "../policy/loader-policy.js";
import { bootstrapExtensionHostPluginLoad } from "./loader-bootstrap.js";
import { createExtensionHostModuleLoader } from "./loader-module-loader.js";
import { createExtensionHostLazyRuntime } from "./loader-runtime-proxy.js";
import {
createExtensionHostLoaderSession,
@ -56,7 +56,7 @@ export function prepareExtensionHostLoaderExecution(params: {
config: params.config,
workspaceDir: params.workspaceDir,
env: params.env,
warningCacheKey: params.cacheKey,
cacheKey: params.cacheKey,
warningCache: params.warningCache,
cache: params.cache,
normalizedConfig: params.normalizedConfig,

View File

@ -1,7 +1,7 @@
import { describe, expect, it } from "vitest";
import type { PluginRegistry } from "../plugins/registry.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import { createExtensionHostPluginRecord } from "../policy/loader-policy.js";
import { finalizeExtensionHostRegistryLoad } from "./loader-finalize.js";
import { createExtensionHostPluginRecord } from "./loader-policy.js";
import { setExtensionHostPluginRecordLifecycleState } from "./loader-state.js";
function createRegistry(): PluginRegistry {

View File

@ -1,7 +1,7 @@
import type { PluginRegistry } from "../plugins/registry.js";
import type { PluginLogger } from "../plugins/types.js";
import { resolveExtensionHostFinalizationPolicy } from "./loader-finalization-policy.js";
import type { ExtensionHostProvenanceIndex } from "./loader-policy.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import type { PluginLogger } from "../../plugins/types.js";
import { resolveExtensionHostFinalizationPolicy } from "../policy/loader-finalization-policy.js";
import type { ExtensionHostProvenanceIndex } from "../policy/loader-provenance.js";
import { markExtensionHostRegistryPluginsReady } from "./loader-state.js";
export function finalizeExtensionHostRegistryLoad(params: {

View File

@ -2,10 +2,10 @@ import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { afterEach, describe, expect, it } from "vitest";
import { normalizePluginsConfig } from "../plugins/config-state.js";
import type { PluginCandidate } from "../plugins/discovery.js";
import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
import type { PluginRegistry } from "../plugins/registry.js";
import { normalizePluginsConfig } from "../../plugins/config-state.js";
import type { PluginCandidate } from "../../plugins/discovery.js";
import type { PluginManifestRecord } from "../../plugins/manifest-registry.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import { processExtensionHostPluginCandidate } from "./loader-flow.js";
const tempDirs: string[] = [];

View File

@ -1,11 +1,12 @@
import type { OpenClawConfig } from "../config/config.js";
import type { PluginCandidate } from "../plugins/discovery.js";
import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
import type { PluginRecord, PluginRegistry } from "../plugins/registry.js";
import type { OpenClawPluginApi, OpenClawPluginModule, PluginLogger } from "../plugins/types.js";
import { resolveExtensionHostActivationPolicy } from "./loader-activation-policy.js";
import type { OpenClawConfig } from "../../config/config.js";
import type { NormalizedPluginsConfig } from "../../plugins/config-state.js";
import type { PluginCandidate } from "../../plugins/discovery.js";
import type { PluginManifestRecord } from "../../plugins/manifest-registry.js";
import type { PluginRecord, PluginRegistry } from "../../plugins/registry.js";
import type { OpenClawPluginApi, OpenClawPluginModule, PluginLogger } from "../../plugins/types.js";
import { resolveExtensionHostActivationPolicy } from "../policy/loader-activation-policy.js";
import { recordExtensionHostPluginError } from "../policy/loader-policy.js";
import { importExtensionHostPluginModule } from "./loader-import.js";
import { recordExtensionHostPluginError } from "./loader-policy.js";
import {
planExtensionHostLoadedPlugin,
runExtensionHostPluginRegister,
@ -13,6 +14,7 @@ import {
import { resolveExtensionHostModuleExport } from "./loader-runtime.js";
import {
appendExtensionHostPluginRecord,
setExtensionHostPluginRecordDisabled,
setExtensionHostPluginRecordLifecycleState,
setExtensionHostPluginRecordError,
} from "./loader-state.js";
@ -20,21 +22,7 @@ import {
export function processExtensionHostPluginCandidate(params: {
candidate: PluginCandidate;
manifestRecord: PluginManifestRecord;
normalizedConfig: {
entries: Record<
string,
{
enabled?: boolean;
hooks?: {
allowPromptInjection?: boolean;
};
config?: unknown;
}
>;
slots: {
memory?: string | null;
};
};
normalizedConfig: NormalizedPluginsConfig;
rootConfig: OpenClawConfig;
validateOnly: boolean;
logger: PluginLogger;
@ -85,7 +73,7 @@ export function processExtensionHostPluginCandidate(params: {
level: "error",
pluginId: record.id,
source: record.source,
message: record.error,
message: record.error ?? message,
});
};

View File

@ -1,7 +1,7 @@
import fs from "node:fs";
import path from "node:path";
import { openBoundaryFileSync } from "../infra/boundary-file-read.js";
import type { PluginRecord } from "../plugins/registry.js";
import { openBoundaryFileSync } from "../../infra/boundary-file-read.js";
import type { PluginRecord } from "../../plugins/registry.js";
export function importExtensionHostPluginModule(params: {
rootDir: string;

View File

@ -1,6 +1,6 @@
import { createJiti } from "jiti";
import type { OpenClawPluginModule } from "../plugins/types.js";
import { resolvePluginSdkAlias, resolvePluginSdkScopedAliasMap } from "./loader-compat.js";
import type { OpenClawPluginModule } from "../../plugins/types.js";
import { resolvePluginSdkAlias, resolvePluginSdkScopedAliasMap } from "../compat/loader-compat.js";
type JitiLoaderFactory = typeof createJiti;
type JitiLoader = ReturnType<JitiLoaderFactory>;

View File

@ -1,9 +1,12 @@
import type { OpenClawConfig } from "../config/config.js";
import { createSubsystemLogger } from "../logging/subsystem.js";
import type { PluginRegistry } from "../plugins/registry.js";
import { createPluginRuntime, type CreatePluginRuntimeOptions } from "../plugins/runtime/index.js";
import type { PluginLogger } from "../plugins/types.js";
import { clearExtensionHostPluginCommands } from "./command-runtime.js";
import type { OpenClawConfig } from "../../config/config.js";
import { createSubsystemLogger } from "../../logging/subsystem.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import {
createPluginRuntime,
type CreatePluginRuntimeOptions,
} from "../../plugins/runtime/index.js";
import type { PluginLogger } from "../../plugins/types.js";
import { clearExtensionHostPluginCommands } from "../contributions/command-runtime.js";
import {
clearExtensionHostLoaderHostState,
getExtensionHostDiscoveryWarningCache,
@ -18,7 +21,7 @@ export type ExtensionHostPluginLoadOptions = {
logger?: PluginLogger;
coreGatewayHandlers?: Record<
string,
import("../gateway/server-methods/types.js").GatewayRequestHandler
import("../../gateway/server-methods/types.js").GatewayRequestHandler
>;
runtimeOptions?: CreatePluginRuntimeOptions;
cache?: boolean;

View File

@ -1,8 +1,8 @@
import type { GatewayRequestHandler } from "../gateway/server-methods/types.js";
import type { PluginRegistry } from "../plugins/registry.js";
import type { CreatePluginRuntimeOptions } from "../plugins/runtime/index.js";
import type { PluginRuntime } from "../plugins/runtime/types.js";
import { activateExtensionHostRegistry } from "./activation.js";
import type { GatewayRequestHandler } from "../../gateway/server-methods/types.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import type { CreatePluginRuntimeOptions } from "../../plugins/runtime/index.js";
import type { PluginRuntime } from "../../plugins/runtime/types.js";
import { activateExtensionHostRegistry } from "../activation.js";
import { setCachedExtensionHostRegistry } from "./loader-cache.js";
import { prepareExtensionHostLoaderExecution } from "./loader-execution.js";
import type { ExtensionHostLoaderPreflightReady } from "./loader-preflight.js";

View File

@ -1,7 +1,7 @@
import type { OpenClawConfig } from "../config/config.js";
import { applyTestPluginDefaults, normalizePluginsConfig } from "../plugins/config-state.js";
import type { PluginLogger } from "../plugins/types.js";
import { activateExtensionHostRegistry } from "./activation.js";
import type { OpenClawConfig } from "../../config/config.js";
import { applyTestPluginDefaults, normalizePluginsConfig } from "../../plugins/config-state.js";
import type { PluginLogger } from "../../plugins/types.js";
import { activateExtensionHostRegistry } from "../activation.js";
import {
buildExtensionHostRegistryCacheKey,
getCachedExtensionHostRegistry,

View File

@ -1,8 +1,8 @@
import { describe, expect, it } from "vitest";
import type { OpenClawConfig } from "../config/config.js";
import { normalizePluginsConfig } from "../plugins/config-state.js";
import type { PluginCandidate } from "../plugins/discovery.js";
import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
import type { OpenClawConfig } from "../../config/config.js";
import { normalizePluginsConfig } from "../../plugins/config-state.js";
import type { PluginCandidate } from "../../plugins/discovery.js";
import type { PluginManifestRecord } from "../../plugins/manifest-registry.js";
import { prepareExtensionHostPluginCandidate } from "./loader-records.js";
function createCandidate(overrides: Partial<PluginCandidate> = {}): PluginCandidate {

View File

@ -1,12 +1,12 @@
import type { OpenClawConfig } from "../config/config.js";
import type { OpenClawConfig } from "../../config/config.js";
import {
resolveEffectiveEnableState,
type NormalizedPluginsConfig,
} from "../plugins/config-state.js";
import type { PluginCandidate } from "../plugins/discovery.js";
import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
import type { PluginRecord } from "../plugins/registry.js";
import { createExtensionHostPluginRecord } from "./loader-policy.js";
} from "../../plugins/config-state.js";
import type { PluginCandidate } from "../../plugins/discovery.js";
import type { PluginManifestRecord } from "../../plugins/manifest-registry.js";
import type { PluginRecord } from "../../plugins/registry.js";
import { createExtensionHostPluginRecord } from "../policy/loader-policy.js";
import { setExtensionHostPluginRecordDisabled } from "./loader-state.js";
type CandidateEntry = NormalizedPluginsConfig["entries"][string];

View File

@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
import type { PluginDiagnostic } from "../plugins/types.js";
import { createExtensionHostPluginRecord } from "./loader-policy.js";
import type { PluginDiagnostic } from "../../plugins/types.js";
import { createExtensionHostPluginRecord } from "../policy/loader-policy.js";
import {
planExtensionHostLoadedPlugin,
runExtensionHostPluginRegister,

View File

@ -1,12 +1,11 @@
import type { OpenClawConfig } from "../config/config.js";
import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
import type { PluginRecord } from "../plugins/registry.js";
import type { OpenClawConfig } from "../../config/config.js";
import type { PluginManifestRecord } from "../../plugins/manifest-registry.js";
import type { PluginRecord } from "../../plugins/registry.js";
import type {
OpenClawPluginApi,
OpenClawPluginDefinition,
OpenClawPluginHookOptions,
PluginDiagnostic,
} from "../plugins/types.js";
} from "../../plugins/types.js";
import {
applyExtensionHostDefinitionToRecord,
resolveExtensionHostMemoryDecision,
@ -105,10 +104,11 @@ export function planExtensionHostLoadedPlugin(params: {
value: params.entryConfig,
});
if (!validatedConfig.ok) {
const errors = validatedConfig.errors ?? ["invalid config"];
return {
kind: "invalid-config",
message: `invalid config: ${validatedConfig.errors.join(", ")}`,
errors: validatedConfig.errors,
message: `invalid config: ${errors.join(", ")}`,
errors,
memorySlotMatched,
selectedMemoryPluginId: nextSelectedMemoryPluginId,
};
@ -147,13 +147,13 @@ export function runExtensionHostPluginRegister(params: {
options: {
config: OpenClawConfig;
pluginConfig?: Record<string, unknown>;
hookPolicy?: OpenClawPluginHookOptions;
hookPolicy?: { allowPromptInjection?: boolean };
},
) => OpenClawPluginApi;
record: PluginRecord;
config: OpenClawConfig;
pluginConfig?: Record<string, unknown>;
hookPolicy?: OpenClawPluginHookOptions;
hookPolicy?: { allowPromptInjection?: boolean };
diagnostics: PluginDiagnostic[];
}):
| {

View File

@ -1,5 +1,5 @@
import { describe, expect, it, vi } from "vitest";
import type { PluginRegistry } from "../plugins/registry.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import { runExtensionHostLoaderSession } from "./loader-run.js";
vi.mock("./loader-session.js", () => ({

View File

@ -1,6 +1,7 @@
import type { OpenClawConfig } from "../config/config.js";
import type { PluginRecord } from "../plugins/registry.js";
import type { OpenClawPluginApi, OpenClawPluginModule } from "../plugins/types.js";
import type { OpenClawConfig } from "../../config/config.js";
import type { NormalizedPluginsConfig } from "../../plugins/config-state.js";
import type { PluginRecord } from "../../plugins/registry.js";
import type { OpenClawPluginApi, OpenClawPluginModule } from "../../plugins/types.js";
import type { ExtensionHostLoaderSession } from "./loader-session.js";
import {
finalizeExtensionHostLoaderSession,
@ -13,21 +14,7 @@ export function runExtensionHostLoaderSession(params: {
rootDir: string;
}>;
manifestByRoot: Map<string, { rootDir: string }>;
normalizedConfig: {
entries: Record<
string,
{
enabled?: boolean;
hooks?: {
allowPromptInjection?: boolean;
};
config?: unknown;
}
>;
slots: {
memory?: string | null;
};
};
normalizedConfig: NormalizedPluginsConfig;
rootConfig: OpenClawConfig;
validateOnly: boolean;
createApi: (

View File

@ -1,4 +1,4 @@
import type { PluginRuntime } from "../plugins/runtime/types.js";
import type { PluginRuntime } from "../../plugins/runtime/types.js";
export function createExtensionHostLazyRuntime<TOptions>(params: {
runtimeOptions?: TOptions;

View File

@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { createExtensionHostPluginRecord } from "./loader-policy.js";
import { createExtensionHostPluginRecord } from "../policy/loader-policy.js";
import {
applyExtensionHostDefinitionToRecord,
resolveExtensionHostEarlyMemoryDecision,

View File

@ -1,7 +1,7 @@
import { resolveMemorySlotDecision } from "../plugins/config-state.js";
import type { PluginRecord } from "../plugins/registry.js";
import { validateJsonSchemaValue } from "../plugins/schema-validator.js";
import type { OpenClawPluginDefinition, PluginDiagnostic } from "../plugins/types.js";
import { resolveMemorySlotDecision } from "../../plugins/config-state.js";
import type { PluginRecord } from "../../plugins/registry.js";
import { validateJsonSchemaValue } from "../../plugins/schema-validator.js";
import type { OpenClawPluginDefinition, PluginDiagnostic } from "../../plugins/types.js";
export function validateExtensionHostConfig(params: {
schema?: Record<string, unknown>;
@ -87,7 +87,7 @@ export function resolveExtensionHostEarlyMemoryDecision(params: {
origin: PluginRecord["origin"];
manifestKind?: PluginRecord["kind"];
recordId: string;
memorySlot?: string;
memorySlot?: string | null;
selectedMemoryPluginId: string | null;
}): { enabled: boolean; reason?: string } {
if (params.origin !== "bundled" || params.manifestKind !== "memory") {
@ -108,7 +108,7 @@ export function resolveExtensionHostEarlyMemoryDecision(params: {
export function resolveExtensionHostMemoryDecision(params: {
recordId: string;
recordKind?: PluginRecord["kind"];
memorySlot?: string;
memorySlot?: string | null;
selectedMemoryPluginId: string | null;
}): { enabled: boolean; selected: boolean; reason?: string } {
const decision = resolveMemorySlotDecision({
@ -119,7 +119,7 @@ export function resolveExtensionHostMemoryDecision(params: {
});
return {
enabled: decision.enabled,
selected: decision.selected,
selected: decision.selected === true,
...(decision.enabled ? {} : { reason: decision.reason }),
};
}

View File

@ -2,9 +2,9 @@ import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { afterEach, describe, expect, it } from "vitest";
import { normalizePluginsConfig } from "../plugins/config-state.js";
import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
import type { PluginRegistry } from "../plugins/registry.js";
import { normalizePluginsConfig } from "../../plugins/config-state.js";
import type { PluginManifestRecord } from "../../plugins/manifest-registry.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import {
createExtensionHostLoaderSession,
finalizeExtensionHostLoaderSession,

View File

@ -1,11 +1,12 @@
import type { OpenClawConfig } from "../config/config.js";
import type { PluginCandidate } from "../plugins/discovery.js";
import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
import type { PluginRecord, PluginRegistry } from "../plugins/registry.js";
import type { OpenClawPluginApi, OpenClawPluginModule, PluginLogger } from "../plugins/types.js";
import type { OpenClawConfig } from "../../config/config.js";
import type { NormalizedPluginsConfig } from "../../plugins/config-state.js";
import type { PluginCandidate } from "../../plugins/discovery.js";
import type { PluginManifestRecord } from "../../plugins/manifest-registry.js";
import type { PluginRecord, PluginRegistry } from "../../plugins/registry.js";
import type { OpenClawPluginApi, OpenClawPluginModule, PluginLogger } from "../../plugins/types.js";
import type { ExtensionHostProvenanceIndex } from "../policy/loader-provenance.js";
import { finalizeExtensionHostRegistryLoad } from "./loader-finalize.js";
import { processExtensionHostPluginCandidate } from "./loader-flow.js";
import type { ExtensionHostProvenanceIndex } from "./loader-policy.js";
export type ExtensionHostLoaderSession = {
registry: PluginRegistry;
@ -53,21 +54,7 @@ export function processExtensionHostLoaderSessionCandidate(params: {
session: ExtensionHostLoaderSession;
candidate: PluginCandidate;
manifestRecord: PluginManifestRecord;
normalizedConfig: {
entries: Record<
string,
{
enabled?: boolean;
hooks?: {
allowPromptInjection?: boolean;
};
config?: unknown;
}
>;
slots: {
memory?: string | null;
};
};
normalizedConfig: NormalizedPluginsConfig;
rootConfig: OpenClawConfig;
validateOnly: boolean;
createApi: (

View File

@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
import type { PluginRegistry } from "../plugins/registry.js";
import { createExtensionHostPluginRecord } from "./loader-policy.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import { createExtensionHostPluginRecord } from "../policy/loader-policy.js";
import {
appendExtensionHostPluginRecord,
markExtensionHostRegistryPluginsReady,

View File

@ -2,7 +2,7 @@ import type {
PluginRecord,
PluginRecordLifecycleState,
PluginRegistry,
} from "../plugins/registry.js";
} from "../../plugins/registry.js";
const EXTENSION_HOST_LIFECYCLE_STATUS_MAP: Record<
PluginRecordLifecycleState,

View File

@ -1,13 +1,13 @@
import { registerInternalHook, type InternalHookHandler } from "../hooks/internal-hooks.js";
import { registerInternalHook, type InternalHookHandler } from "../../hooks/internal-hooks.js";
import type {
PluginHookHandlerMap,
PluginHookName,
PluginHookRegistration as TypedPluginHookRegistration,
} from "../plugins/types.js";
} from "../../plugins/types.js";
import {
isPromptInjectionHookName,
stripPromptMutationFieldsFromLegacyHookResult,
} from "../plugins/types.js";
} from "../../plugins/types.js";
export function constrainExtensionHostPromptInjectionHook(
handler: PluginHookHandlerMap["before_agent_start"],

View File

@ -1,7 +1,7 @@
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { resolveOpenClawPackageRootSync } from "../infra/openclaw-root.js";
import { resolveOpenClawPackageRootSync } from "../../infra/openclaw-root.js";
type PluginSdkAliasCandidateKind = "dist" | "src";

View File

@ -1,5 +1,5 @@
import { describe, expect, it, vi } from "vitest";
import type { PluginRecord } from "../plugins/registry.js";
import type { PluginRecord } from "../../plugins/registry.js";
import { createExtensionHostPluginApi, normalizeExtensionHostPluginLogger } from "./plugin-api.js";
function createRecord(): PluginRecord {

View File

@ -1,19 +1,21 @@
import type { PluginRecord } from "../plugins/registry.js";
import type { PluginRuntime } from "../plugins/runtime/types.js";
import type { AnyAgentTool } from "../../agents/tools/common.js";
import type { PluginRecord } from "../../plugins/registry.js";
import type { PluginRuntime } from "../../plugins/runtime/types.js";
import type {
OpenClawPluginApi,
OpenClawPluginChannelRegistration,
OpenClawPluginCliRegistrar,
OpenClawPluginCommandDefinition,
OpenClawPluginHttpRouteParams,
PluginInteractiveHandlerRegistration,
OpenClawPluginService,
OpenClawPluginToolFactory,
PluginLogger,
PluginHookName,
PluginHookHandlerMap,
ProviderPlugin,
} from "../plugins/types.js";
import { resolveUserPath } from "../utils.js";
} from "../../plugins/types.js";
import { resolveUserPath } from "../../utils.js";
export function normalizeExtensionHostPluginLogger(logger: PluginLogger): PluginLogger {
return {
@ -31,7 +33,7 @@ export function createExtensionHostPluginApi(params: {
config: OpenClawPluginApi["config"];
pluginConfig?: Record<string, unknown>;
registerTool: (
tool: OpenClawPluginToolFactory | { name: string },
tool: OpenClawPluginToolFactory | AnyAgentTool,
opts?: { name?: string; names?: string[]; optional?: boolean },
) => void;
registerHook: (
@ -48,6 +50,7 @@ export function createExtensionHostPluginApi(params: {
? H
: never,
) => void;
registerInteractiveHandler: (registration: PluginInteractiveHandlerRegistration) => void;
registerCli: (registrar: OpenClawPluginCliRegistrar, opts?: { commands?: string[] }) => void;
registerService: (service: OpenClawPluginService) => void;
registerCommand: (command: OpenClawPluginCommandDefinition) => void;
@ -77,6 +80,7 @@ export function createExtensionHostPluginApi(params: {
registerChannel: (registration) => params.registerChannel(registration),
registerProvider: (provider) => params.registerProvider(provider),
registerGatewayMethod: (method, handler) => params.registerGatewayMethod(method, handler),
registerInteractiveHandler: (registration) => params.registerInteractiveHandler(registration),
registerCli: (registrar, opts) => params.registerCli(registrar, opts),
registerService: (service) => params.registerService(service),
registerCommand: (command) => params.registerCommand(command),

View File

@ -1,6 +1,6 @@
import { describe, expect, it, vi } from "vitest";
import { clearPluginCommands } from "../plugins/commands.js";
import { createEmptyPluginRegistry, type PluginRecord } from "../plugins/registry.js";
import { clearPluginCommands } from "../../plugins/commands.js";
import { createEmptyPluginRegistry, type PluginRecord } from "../../plugins/registry.js";
import {
resolveExtensionHostCommandCompatibility,
resolveExtensionHostProviderCompatibility,

View File

@ -1,18 +1,18 @@
import { normalizeRegisteredProvider } from "../plugins/provider-validation.js";
import type { PluginRecord, PluginRegistry } from "../plugins/registry.js";
import { normalizeRegisteredProvider } from "../../plugins/provider-validation.js";
import type { PluginRecord, PluginRegistry } from "../../plugins/registry.js";
import type {
OpenClawPluginCommandDefinition,
PluginDiagnostic,
ProviderPlugin,
} from "../plugins/types.js";
import { registerExtensionHostPluginCommand } from "./command-runtime.js";
} from "../../plugins/types.js";
import { registerExtensionHostPluginCommand } from "../contributions/command-runtime.js";
import {
type ExtensionHostCommandRegistration,
type ExtensionHostProviderRegistration,
resolveExtensionCommandRegistration,
resolveExtensionProviderRegistration,
} from "./runtime-registrations.js";
import { listExtensionHostProviderRegistrations } from "./runtime-registry.js";
} from "../contributions/runtime-registrations.js";
import { listExtensionHostProviderRegistrations } from "../contributions/runtime-registry.js";
export function pushExtensionHostRegistryDiagnostic(params: {
registry: PluginRegistry;

View File

@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { createEmptyPluginRegistry, type PluginRecord } from "../plugins/registry.js";
import { createEmptyPluginRegistry, type PluginRecord } from "../../plugins/registry.js";
import { createExtensionHostPluginRegistrationActions } from "./plugin-registry-registrations.js";
function createRecord(): PluginRecord {

View File

@ -1,9 +1,9 @@
import type { AnyAgentTool } from "../agents/tools/common.js";
import type { ChannelPlugin } from "../channels/plugins/types.js";
import { registerContextEngine as registerLegacyContextEngine } from "../context-engine/registry.js";
import type { GatewayRequestHandler } from "../gateway/server-methods/types.js";
import { registerInternalHook } from "../hooks/internal-hooks.js";
import type { PluginRecord, PluginRegistry } from "../plugins/registry.js";
import type { AnyAgentTool } from "../../agents/tools/common.js";
import type { ChannelPlugin } from "../../channels/plugins/types.js";
import { registerContextEngine as registerLegacyContextEngine } from "../../context-engine/registry.js";
import type { GatewayRequestHandler } from "../../gateway/server-methods/types.js";
import { registerInternalHook } from "../../hooks/internal-hooks.js";
import type { PluginRecord, PluginRegistry } from "../../plugins/registry.js";
import type {
PluginHookHandlerMap,
PluginHookName,
@ -15,12 +15,7 @@ import type {
OpenClawPluginService,
OpenClawPluginToolFactory,
PluginHookRegistration as TypedPluginHookRegistration,
} from "../plugins/types.js";
import {
applyExtensionHostTypedHookPolicy,
bridgeExtensionHostLegacyHooks,
} from "./hook-compat.js";
import { pushExtensionHostRegistryDiagnostic } from "./plugin-registry-compat.js";
} from "../../plugins/types.js";
import {
addExtensionChannelRegistration,
addExtensionCliRegistration,
@ -31,7 +26,7 @@ import {
addExtensionServiceRegistration,
addExtensionToolRegistration,
addExtensionTypedHookRegistration,
} from "./registry-writes.js";
} from "../contributions/registry-writes.js";
import {
resolveExtensionChannelRegistration,
resolveExtensionCliRegistration,
@ -42,12 +37,17 @@ import {
resolveExtensionServiceRegistration,
resolveExtensionToolRegistration,
resolveExtensionTypedHookRegistration,
} from "./runtime-registrations.js";
} from "../contributions/runtime-registrations.js";
import {
listExtensionHostChannelRegistrations,
getExtensionHostGatewayHandlers,
listExtensionHostHttpRoutes,
} from "./runtime-registry.js";
} from "../contributions/runtime-registry.js";
import {
applyExtensionHostTypedHookPolicy,
bridgeExtensionHostLegacyHooks,
} from "./hook-compat.js";
import { pushExtensionHostRegistryDiagnostic } from "./plugin-registry-compat.js";
export type PluginTypedHookPolicy = {
allowPromptInjection?: boolean;

View File

@ -1,6 +1,6 @@
import { describe, expect, it, vi } from "vitest";
import { clearPluginCommands } from "../plugins/commands.js";
import { createEmptyPluginRegistry, type PluginRecord } from "../plugins/registry.js";
import { clearPluginCommands } from "../../plugins/commands.js";
import { createEmptyPluginRegistry, type PluginRecord } from "../../plugins/registry.js";
import { createExtensionHostPluginRegistry } from "./plugin-registry.js";
function createRecord(): PluginRecord {

View File

@ -1,10 +1,16 @@
import type { PluginRecord, PluginRegistry, PluginRegistryParams } from "../plugins/registry.js";
import { registerPluginInteractiveHandler } from "../../plugins/interactive.js";
import type { PluginRecord, PluginRegistry, PluginRegistryParams } from "../../plugins/registry.js";
import type {
PluginDiagnostic,
OpenClawPluginApi,
OpenClawPluginCommandDefinition,
PluginInteractiveHandlerRegistration,
ProviderPlugin,
} from "../plugins/types.js";
} from "../../plugins/types.js";
import {
addExtensionCommandRegistration,
addExtensionProviderRegistration,
} from "../contributions/registry-writes.js";
import { createExtensionHostPluginApi } from "./plugin-api.js";
import {
resolveExtensionHostCommandCompatibility,
@ -14,10 +20,6 @@ import {
createExtensionHostPluginRegistrationActions,
type PluginTypedHookPolicy,
} from "./plugin-registry-registrations.js";
import {
addExtensionCommandRegistration,
addExtensionProviderRegistration,
} from "./registry-writes.js";
export function createExtensionHostPluginRegistry(params: {
registry: PluginRegistry;
@ -85,6 +87,20 @@ export function createExtensionHostPluginRegistry(params: {
registerProvider: (provider) => registerProvider(record, provider),
registerGatewayMethod: (method, handler) =>
actions.registerGatewayMethod(record, method, handler),
registerInteractiveHandler: (registration: PluginInteractiveHandlerRegistration) => {
const result = registerPluginInteractiveHandler(record.id, registration, {
pluginName: record.name,
pluginRoot: record.rootDir,
});
if (!result.ok) {
pushDiagnostic({
level: "warn",
pluginId: record.id,
source: record.source,
message: result.error ?? "interactive handler registration failed",
});
}
},
registerCli: (registrar, opts) => actions.registerCli(record, registrar, opts),
registerService: (service) => actions.registerService(record, service),
registerCommand: (command) => registerCommand(record, command),

View File

@ -1,7 +1,7 @@
import { Command } from "commander";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { createEmptyPluginRegistry } from "../plugins/registry.js";
import type { PluginLogger } from "../plugins/types.js";
import { createEmptyPluginRegistry } from "../../plugins/registry.js";
import type { PluginLogger } from "../../plugins/types.js";
import { registerExtensionHostCliCommands } from "./cli-lifecycle.js";
function createLogger(): PluginLogger {

View File

@ -1,7 +1,7 @@
import type { Command } from "commander";
import type { OpenClawConfig } from "../config/config.js";
import type { PluginRegistry } from "../plugins/registry.js";
import type { PluginLogger } from "../plugins/types.js";
import type { OpenClawConfig } from "../../config/config.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import type { PluginLogger } from "../../plugins/types.js";
import { listExtensionHostCliRegistrations } from "./runtime-registry.js";
export function registerExtensionHostCliCommands(params: {

View File

@ -1,10 +1,10 @@
import type { OpenClawConfig } from "../config/config.js";
import { logVerbose } from "../globals.js";
import type { OpenClawConfig } from "../../config/config.js";
import { logVerbose } from "../../globals.js";
import type {
OpenClawPluginCommandDefinition,
PluginCommandContext,
PluginCommandResult,
} from "../plugins/types.js";
} from "../../plugins/types.js";
export type RegisteredExtensionHostPluginCommand = OpenClawPluginCommandDefinition & {
pluginId: string;
@ -210,6 +210,12 @@ export async function executeExtensionHostPluginCommand(params: {
to: params.to,
accountId: params.accountId,
messageThreadId: params.messageThreadId,
requestConversationBinding: async () => ({
status: "error" as const,
message: "Conversation binding is unavailable for this command surface.",
}),
detachConversationBinding: async () => ({ removed: false }),
getCurrentConversationBinding: async () => null,
};
extensionHostCommandRegistryLocked = true;

View File

@ -1,5 +1,5 @@
import { describe, expect, it, vi } from "vitest";
import { createEmptyPluginRegistry } from "../plugins/registry.js";
import { createEmptyPluginRegistry } from "../../plugins/registry.js";
import {
createExtensionHostGatewayExtraHandlers,
logExtensionHostPluginDiagnostics,

View File

@ -1,6 +1,6 @@
import type { GatewayRequestHandlers } from "../gateway/server-methods/types.js";
import type { PluginRegistry } from "../plugins/registry.js";
import type { PluginDiagnostic } from "../plugins/types.js";
import type { GatewayRequestHandlers } from "../../gateway/server-methods/types.js";
import type { PluginRegistry } from "../../plugins/registry.js";
import type { PluginDiagnostic } from "../../plugins/types.js";
import { getExtensionHostGatewayHandlers } from "./runtime-registry.js";
export function resolveExtensionHostGatewayMethods(params: {

View File

@ -1,23 +1,23 @@
import { resolveOpenClawAgentDir } from "../agents/agent-paths.js";
import { resolveOpenClawAgentDir } from "../../agents/agent-paths.js";
import {
resolveDefaultAgentId,
resolveAgentDir,
resolveAgentWorkspaceDir,
} from "../agents/agent-scope.js";
import { upsertAuthProfile } from "../agents/auth-profiles.js";
import { resolveDefaultAgentWorkspaceDir } from "../agents/workspace.js";
} from "../../agents/agent-scope.js";
import { upsertAuthProfile } from "../../agents/auth-profiles.js";
import { resolveDefaultAgentWorkspaceDir } from "../../agents/workspace.js";
import type {
ApplyAuthChoiceParams,
ApplyAuthChoiceResult,
} from "../commands/auth-choice.apply.js";
import { isRemoteEnvironment } from "../commands/oauth-env.js";
import { createVpsAwareOAuthHandlers } from "../commands/oauth-flow.js";
import { applyAuthProfileConfig } from "../commands/onboard-auth.js";
import { openUrl } from "../commands/onboard-helpers.js";
import { enablePluginInConfig } from "../plugins/enable.js";
import { resolveProviderPluginChoice } from "../plugins/provider-wizard.js";
import { resolvePluginProviders } from "../plugins/providers.js";
import type { ProviderAuthMethod } from "../plugins/types.js";
} from "../../commands/auth-choice.apply.js";
import { isRemoteEnvironment } from "../../commands/oauth-env.js";
import { createVpsAwareOAuthHandlers } from "../../commands/oauth-flow.js";
import { applyAuthProfileConfig } from "../../commands/onboard-auth.js";
import { openUrl } from "../../commands/onboard-helpers.js";
import { enablePluginInConfig } from "../../plugins/enable.js";
import { resolveProviderPluginChoice } from "../../plugins/provider-wizard.js";
import { resolvePluginProviders } from "../../plugins/providers.js";
import type { ProviderAuthMethod } from "../../plugins/types.js";
import {
applyExtensionHostDefaultModel,
mergeExtensionHostConfigPatch,

View File

@ -1,5 +1,5 @@
import { describe, expect, it, vi } from "vitest";
import type { ProviderPlugin } from "../plugins/types.js";
import type { ProviderPlugin } from "../../plugins/types.js";
import {
applyExtensionHostDefaultModel,
mergeExtensionHostConfigPatch,

View File

@ -1,6 +1,6 @@
import { normalizeProviderId } from "../agents/provider-id.js";
import type { OpenClawConfig } from "../config/config.js";
import type { ProviderAuthMethod, ProviderPlugin } from "../plugins/types.js";
import { normalizeProviderId } from "../../agents/provider-id.js";
import type { OpenClawConfig } from "../../config/config.js";
import type { ProviderAuthMethod, ProviderPlugin } from "../../plugins/types.js";
export function resolveExtensionHostProviderMatch(
providers: ProviderPlugin[],

View File

@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
import type { ModelProviderConfig } from "../config/types.js";
import type { ProviderDiscoveryOrder, ProviderPlugin } from "../plugins/types.js";
import type { ModelProviderConfig } from "../../config/types.js";
import type { ProviderDiscoveryOrder, ProviderPlugin } from "../../plugins/types.js";
import {
groupExtensionHostDiscoveryProvidersByOrder,
normalizeExtensionHostDiscoveryResult,

View File

@ -1,6 +1,6 @@
import { normalizeProviderId } from "../agents/provider-id.js";
import type { ModelProviderConfig } from "../config/types.js";
import type { ProviderDiscoveryOrder, ProviderPlugin } from "../plugins/types.js";
import { normalizeProviderId } from "../../agents/provider-id.js";
import type { ModelProviderConfig } from "../../config/types.js";
import type { ProviderDiscoveryOrder, ProviderPlugin } from "../../plugins/types.js";
const DISCOVERY_ORDER: readonly ProviderDiscoveryOrder[] = ["simple", "profile", "paired", "late"];

View File

@ -1,9 +1,9 @@
import { DEFAULT_PROVIDER } from "../agents/defaults.js";
import { parseModelRef } from "../agents/model-ref.js";
import { normalizeProviderId } from "../agents/provider-id.js";
import type { OpenClawConfig } from "../config/config.js";
import { resolvePluginProviders } from "../plugins/providers.js";
import type { WizardPrompter } from "../wizard/prompts.js";
import { DEFAULT_PROVIDER } from "../../agents/defaults.js";
import { parseModelRef } from "../../agents/model-ref.js";
import { normalizeProviderId } from "../../agents/provider-id.js";
import type { OpenClawConfig } from "../../config/config.js";
import { resolvePluginProviders } from "../../plugins/providers.js";
import type { WizardPrompter } from "../../wizard/prompts.js";
export async function runExtensionHostProviderModelSelectedHook(params: {
config: OpenClawConfig;

View File

@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { createEmptyPluginRegistry } from "../plugins/registry.js";
import { createEmptyPluginRegistry } from "../../plugins/registry.js";
import { resolveExtensionHostProviders } from "./provider-runtime.js";
import { addExtensionHostProviderRegistration } from "./runtime-registry.js";

View File

@ -0,0 +1,22 @@
import type { PluginRegistry } from "../../plugins/registry.js";
import type { ProviderPlugin } from "../../plugins/types.js";
import { listExtensionHostProviderRegistrations } from "./runtime-registry.js";
export function resolveExtensionHostProviders(params: {
registry: Pick<
PluginRegistry,
| "channels"
| "tools"
| "providers"
| "cliRegistrars"
| "commands"
| "services"
| "httpRoutes"
| "gatewayHandlers"
>;
}): ProviderPlugin[] {
return listExtensionHostProviderRegistrations(params.registry).map((entry) => ({
...entry.provider,
pluginId: entry.pluginId,
}));
}

View File

@ -1,5 +1,5 @@
import { describe, expect, it, vi } from "vitest";
import type { ProviderPlugin } from "../plugins/types.js";
import type { ProviderPlugin } from "../../plugins/types.js";
import {
buildExtensionHostProviderMethodChoice,
resolveExtensionHostProviderChoice,

View File

@ -1,10 +1,10 @@
import { normalizeProviderId } from "../agents/provider-id.js";
import { normalizeProviderId } from "../../agents/provider-id.js";
import type {
ProviderAuthMethod,
ProviderPlugin,
ProviderPluginWizardModelPicker,
ProviderPluginWizardOnboarding,
} from "../plugins/types.js";
} from "../../plugins/types.js";
export const EXTENSION_HOST_PROVIDER_CHOICE_PREFIX = "provider-plugin:";

View File

@ -1,5 +1,5 @@
import { describe, expect, it, vi } from "vitest";
import { createEmptyPluginRegistry, type PluginRecord } from "../plugins/registry.js";
import { createEmptyPluginRegistry, type PluginRecord } from "../../plugins/registry.js";
import {
addExtensionChannelRegistration,
addExtensionCliRegistration,

View File

@ -1,5 +1,5 @@
import { registerContextEngine, type ContextEngineFactory } from "../context-engine/registry.js";
import type { GatewayRequestHandler } from "../gateway/server-methods/types.js";
import { registerContextEngine, type ContextEngineFactory } from "../../context-engine/registry.js";
import type { GatewayRequestHandler } from "../../gateway/server-methods/types.js";
import type {
PluginChannelRegistration,
PluginCliRegistration,
@ -11,8 +11,8 @@ import type {
PluginProviderRegistration,
PluginServiceRegistration,
PluginToolRegistration,
} from "../plugins/registry.js";
import type { PluginHookRegistration as TypedPluginHookRegistration } from "../plugins/types.js";
} from "../../plugins/registry.js";
import type { PluginHookRegistration as TypedPluginHookRegistration } from "../../plugins/types.js";
import type {
ExtensionHostChannelRegistration,
ExtensionHostCliRegistration,

View File

@ -1,9 +1,9 @@
import { describe, expect, it, vi } from "vitest";
import type { AnyAgentTool } from "../agents/tools/common.js";
import type { ChannelPlugin } from "../channels/plugins/types.js";
import type { ContextEngineFactory } from "../context-engine/registry.js";
import type { InternalHookHandler } from "../hooks/internal-hooks.js";
import type { HookEntry } from "../hooks/types.js";
import type { AnyAgentTool } from "../../agents/tools/common.js";
import type { ChannelPlugin } from "../../channels/plugins/types.js";
import type { ContextEngineFactory } from "../../context-engine/registry.js";
import type { InternalHookHandler } from "../../hooks/internal-hooks.js";
import type { HookEntry } from "../../hooks/types.js";
import type {
OpenClawPluginCliContext,
OpenClawPluginCommandDefinition,
@ -11,7 +11,7 @@ import type {
OpenClawPluginService,
PluginHookRegistration,
ProviderPlugin,
} from "../plugins/types.js";
} from "../../plugins/types.js";
import {
resolveExtensionChannelRegistration,
resolveExtensionCliRegistration,

View File

@ -1,16 +1,16 @@
import path from "node:path";
import type { AnyAgentTool } from "../agents/tools/common.js";
import type { ChannelDock } from "../channels/dock.js";
import type { ChannelPlugin } from "../channels/plugins/types.js";
import type { ContextEngineFactory } from "../context-engine/registry.js";
import type { AnyAgentTool } from "../../agents/tools/common.js";
import type { ChannelDock } from "../../channels/dock.js";
import type { ChannelPlugin } from "../../channels/plugins/types.js";
import type { ContextEngineFactory } from "../../context-engine/registry.js";
import type {
GatewayRequestHandler,
GatewayRequestHandlers,
} from "../gateway/server-methods/types.js";
import type { InternalHookHandler } from "../hooks/internal-hooks.js";
import type { HookEntry } from "../hooks/types.js";
import { normalizePluginHttpPath } from "../plugins/http-path.js";
import { findOverlappingPluginHttpRoute } from "../plugins/http-route-overlap.js";
} from "../../gateway/server-methods/types.js";
import type { InternalHookHandler } from "../../hooks/internal-hooks.js";
import type { HookEntry } from "../../hooks/types.js";
import { normalizePluginHttpPath } from "../../plugins/http-path.js";
import { findOverlappingPluginHttpRoute } from "../../plugins/http-route-overlap.js";
import type {
OpenClawPluginCliRegistrar,
OpenClawPluginCommandDefinition,
@ -27,8 +27,8 @@ import type {
PluginHookName,
PluginHookRegistration,
ProviderPlugin,
} from "../plugins/types.js";
import { isPluginHookName } from "../plugins/types.js";
} from "../../plugins/types.js";
import { isPluginHookName } from "../../plugins/types.js";
export type ExtensionHostChannelRegistration = {
pluginId: string;
@ -110,10 +110,13 @@ export function resolveExtensionToolRegistration(params: {
names.push(params.tool.name);
}
const normalizedNames = normalizeNameList(names);
const factory: OpenClawPluginToolFactory =
typeof params.tool === "function"
? params.tool
: (_ctx: OpenClawPluginToolContext) => params.tool;
let factory: OpenClawPluginToolFactory;
if (typeof params.tool === "function") {
factory = params.tool;
} else {
const tool = params.tool;
factory = (_ctx: OpenClawPluginToolContext) => tool;
}
return {
names: normalizedNames,

View File

@ -1,5 +1,5 @@
import { describe, expect, it, vi } from "vitest";
import { createEmptyPluginRegistry } from "../plugins/registry.js";
import { createEmptyPluginRegistry } from "../../plugins/registry.js";
import {
addExtensionHostChannelRegistration,
addExtensionHostCliRegistration,

View File

@ -1,4 +1,4 @@
import type { GatewayRequestHandlers } from "../gateway/server-methods/types.js";
import type { GatewayRequestHandlers } from "../../gateway/server-methods/types.js";
import type {
PluginChannelRegistration,
PluginCliRegistration,
@ -8,7 +8,7 @@ import type {
PluginRegistry,
PluginServiceRegistration,
PluginToolRegistration,
} from "../plugins/registry.js";
} from "../../plugins/registry.js";
const EMPTY_PROVIDERS: readonly PluginProviderRegistration[] = [];
const EMPTY_TOOLS: readonly PluginToolRegistration[] = [];

Some files were not shown because too many files have changed in this diff Show More