@elizaos/plugin-registry 2.0.11-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +90 -0
- package/dist/api/app-plugins-routes.d.ts +103 -0
- package/dist/api/app-plugins-routes.d.ts.map +1 -0
- package/dist/api/app-plugins-routes.js +1185 -0
- package/dist/api/app-plugins-routes.js.map +1 -0
- package/dist/api/plugin-routes.d.ts +140 -0
- package/dist/api/plugin-routes.d.ts.map +1 -0
- package/dist/api/plugin-routes.js +1391 -0
- package/dist/api/plugin-routes.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/services/plugin-installer.d.ts +22 -0
- package/dist/services/plugin-installer.d.ts.map +1 -0
- package/dist/services/plugin-installer.js +34 -0
- package/dist/services/plugin-installer.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/plugin-routes.ts"],"sourcesContent":["import type http from \"node:http\";\n// Consolidated from packages/agent/src/api/plugin-routes.ts.\n// Moved from packages/agent/src/api/plugin-routes.ts into the\n// @elizaos/plugin-registry plugin. Agent-internal helpers now reach this\n// handler via the @elizaos/agent public package surface, so the file no\n// longer needs `../config/...` / `../runtime/...` / `../services/...` deep\n// imports across the agent package boundary.\nimport {\n type AdvancedCapabilityPluginId,\n applyAdvancedCapabilitiesConfig,\n applyPluginRuntimeMutation,\n CORE_PLUGINS,\n type CoreManagerLike,\n type ElizaConfig,\n getPluginWidgets,\n type InstallProgressLike,\n isAdvancedCapabilityPluginId,\n loadElizaConfig,\n OPTIONAL_CORE_PLUGINS,\n type PluginManagerLike,\n type PluginParamInfo,\n type PluginWidgetDeclarationServer,\n type RegistryPluginManagerInfo as RegistryPluginInfo,\n type ResolvedPlugin,\n resolveAdvancedCapabilitiesEnabled,\n resolveDefaultAgentWorkspaceDir,\n saveElizaConfig,\n validatePluginConfig,\n} from \"@elizaos/agent\";\nimport type { AgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport type { PluginParamDef, ReadJsonBodyOptions } from \"@elizaos/shared\";\nimport {\n asRecord,\n isElizaSettingsDebugEnabled,\n PostPluginCoreToggleRequestSchema,\n PostPluginInstallRequestSchema,\n PostPluginUninstallRequestSchema,\n PostPluginUpdateRequestSchema,\n PutPluginRequestSchema,\n PutSecretsRequestSchema,\n sanitizeForSettingsDebug,\n settingsDebugCloudSummary,\n} from \"@elizaos/shared\";\n\n/** Normalize npm names to list/toggle ids. Handles both `@elizaos/plugin-*` (current) and legacy `@elizaos/app-*`. */\nfunction optionalPluginListId(npmName: string): string {\n if (npmName.startsWith(\"@elizaos/app-\")) {\n return npmName.slice(\"@elizaos/\".length);\n }\n return npmName.replace(\"@elizaos/plugin-\", \"\");\n}\n\nconst ADVANCED_CAPABILITY_SERVICE_BY_PLUGIN_ID: Partial<\n Record<AdvancedCapabilityPluginId, string>\n> = {\n experience: \"EXPERIENCE\",\n personality: \"CHARACTER_MANAGEMENT\",\n};\n\n// ---------------------------------------------------------------------------\n// Types — kept lean to avoid circular deps with server.ts\n// ---------------------------------------------------------------------------\n\n// PluginParamDef is imported from @elizaos/shared above.\n\ninterface PluginEntry {\n id: string;\n name: string;\n description: string;\n tags: string[];\n enabled: boolean;\n configured: boolean;\n envKey: string | null;\n category:\n | \"ai-provider\"\n | \"connector\"\n | \"streaming\"\n | \"database\"\n | \"app\"\n | \"feature\";\n source: \"bundled\" | \"store\";\n configKeys: string[];\n parameters: PluginParamDef[];\n validationErrors: Array<{ field: string; message: string }>;\n validationWarnings: Array<{ field: string; message: string }>;\n npmName?: string;\n directory?: string | null;\n registryKind?: string;\n origin?: \"builtin\" | \"third-party\" | string;\n registrySource?: string;\n support?: \"first-party\" | \"community\" | string;\n builtIn?: boolean;\n firstParty?: boolean;\n thirdParty?: boolean;\n status?: string;\n version?: string;\n releaseStream?: \"latest\" | \"beta\";\n requestedVersion?: string;\n latestVersion?: string | null;\n betaVersion?: string | null;\n pluginDeps?: string[];\n isActive?: boolean;\n loadError?: string;\n configUiHints?: Record<string, Record<string, unknown>>;\n icon?: string | null;\n homepage?: string;\n repository?: string;\n setupGuideUrl?: string;\n autoEnabled?: boolean;\n managementMode?: \"standard\" | \"core-optional\";\n capabilityStatus?:\n | \"loaded\"\n | \"auto-enabled\"\n | \"blocked\"\n | \"missing-prerequisites\"\n | \"disabled\";\n capabilityReason?: string | null;\n prerequisites?: Array<{ label: string; met: boolean }>;\n /** Widget declarations for this plugin (rendered by the UI widget system). */\n widgets?: PluginWidgetDeclarationServer[];\n /** App metadata (nav tabs, developer-only, app-store visibility). */\n app?: {\n displayName?: string;\n category?: string;\n icon?: string | null;\n developerOnly?: boolean;\n visibleInAppStore?: boolean;\n navTabs?: Array<{\n id: string;\n label: string;\n icon?: string;\n path: string;\n order?: number;\n developerOnly?: boolean;\n group?: string;\n componentExport?: string;\n }>;\n };\n}\n\ntype PluginHealthProbeResult = {\n ok?: boolean;\n message?: string;\n};\n\nfunction getPluginHealthProbe(\n plugin: unknown,\n): (() => PluginHealthProbeResult | Promise<PluginHealthProbeResult>) | null {\n if (!plugin || typeof plugin !== \"object\") {\n return null;\n }\n const record = plugin as Record<string, unknown>;\n for (const key of [\"health\", \"healthCheck\", \"testConnection\", \"test\"]) {\n const candidate = record[key];\n if (typeof candidate === \"function\") {\n return candidate as () =>\n | PluginHealthProbeResult\n | Promise<PluginHealthProbeResult>;\n }\n }\n return null;\n}\n\ninterface SecretEntry {\n key: string;\n description: string;\n category: string;\n sensitive: boolean;\n required: boolean;\n isSet: boolean;\n maskedValue: string | null;\n usedBy: Array<{ pluginId: string; pluginName: string; enabled: boolean }>;\n}\n\ntype CoreToggleDriftFlag = \"entries_vs_allowlist\" | \"entries_vs_compat\";\n\ninterface CoreToggleDriftDiagnostic {\n pluginId: string;\n npmName: string;\n enabled_allowlist: boolean;\n enabled_entries: boolean | null;\n enabled_compat: boolean | null;\n drift_flags: CoreToggleDriftFlag[];\n}\n\nfunction normalizeRegistryLookupKey(value: string | undefined): string | null {\n const trimmed = value?.trim();\n return trimmed ? trimmed.toLowerCase() : null;\n}\n\nfunction registryLookupCandidates(plugin: PluginEntry): string[] {\n const candidates = new Set<string>();\n const add = (value: string | undefined) => {\n const normalized = normalizeRegistryLookupKey(value);\n if (normalized) candidates.add(normalized);\n };\n\n add(plugin.npmName);\n add(plugin.name);\n add(plugin.id);\n add(`@elizaos/plugin-${plugin.id}`);\n add(`@elizaos/app-${plugin.id}`);\n\n return Array.from(candidates);\n}\n\nfunction applyRegistryMetadata(\n plugin: PluginEntry,\n registryMetadataByName: Map<string, RegistryPluginInfo>,\n): void {\n const registryInfo = registryLookupCandidates(plugin)\n .map((candidate) => registryMetadataByName.get(candidate))\n .find((candidate): candidate is RegistryPluginInfo => Boolean(candidate));\n\n if (!registryInfo) {\n if (plugin.npmName?.startsWith(\"@elizaos/\")) {\n plugin.origin ??= \"builtin\";\n plugin.registrySource ??= \"builtin\";\n plugin.support ??= \"first-party\";\n plugin.builtIn ??= true;\n plugin.firstParty ??= true;\n plugin.thirdParty ??= false;\n }\n return;\n }\n\n plugin.directory = registryInfo.directory ?? plugin.directory ?? null;\n plugin.registryKind =\n registryInfo.registryKind ?? registryInfo.kind ?? plugin.registryKind;\n plugin.origin = registryInfo.origin ?? plugin.origin;\n plugin.registrySource = registryInfo.source ?? plugin.registrySource;\n plugin.support = registryInfo.support ?? plugin.support;\n plugin.builtIn = registryInfo.builtIn ?? plugin.builtIn;\n plugin.firstParty = registryInfo.firstParty ?? plugin.firstParty;\n plugin.thirdParty = registryInfo.thirdParty ?? plugin.thirdParty;\n plugin.status = registryInfo.status ?? plugin.status;\n plugin.homepage = plugin.homepage ?? registryInfo.homepage ?? undefined;\n plugin.repository =\n plugin.repository ?? `https://github.com/${registryInfo.gitRepo}`;\n plugin.latestVersion =\n plugin.latestVersion ??\n registryInfo.npm.v2Version ??\n registryInfo.npm.v1Version ??\n registryInfo.npm.v0Version ??\n null;\n}\n\nexport interface PluginRouteContext {\n req: http.IncomingMessage;\n res: http.ServerResponse;\n method: string;\n pathname: string;\n url: URL;\n state: {\n runtime: AgentRuntime | null;\n config: ElizaConfig;\n plugins: PluginEntry[];\n broadcastWs: ((data: object) => void) | null;\n };\n // Helpers from server.ts\n json: (res: http.ServerResponse, data: unknown, status?: number) => void;\n error: (res: http.ServerResponse, message: string, status?: number) => void;\n readJsonBody: <T extends object>(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n options?: ReadJsonBodyOptions,\n ) => Promise<T | null>;\n scheduleRuntimeRestart: (reason: string) => void;\n restartRuntime?: (reason: string) => Promise<boolean>;\n // Server.ts internal helpers\n BLOCKED_ENV_KEYS: Set<string>;\n discoverInstalledPlugins: (\n config: ElizaConfig,\n bundledIds: Set<string>,\n ) => PluginEntry[];\n maskValue: (value: string) => string;\n aggregateSecrets: (plugins: PluginEntry[]) => SecretEntry[];\n readProviderCache: (\n providerId: string,\n ) => { models: Array<{ id: string; name: string; category: string }> } | null;\n paramKeyToCategory: (paramKey: string) => string;\n buildPluginEvmDiagnosticEntry: (opts: {\n config: ElizaConfig;\n runtime: AgentRuntime | null;\n }) => PluginEntry;\n EVM_PLUGIN_PACKAGE: string;\n applyWhatsAppQrOverride: (\n plugins: PluginEntry[],\n workspaceDir: string,\n ) => void;\n applySignalQrOverride: (plugins: PluginEntry[], workspaceDir: string) => void;\n resolvePluginConfigMutationRejections: (\n parameters: PluginParamDef[],\n configObj: Record<string, string>,\n ) => Array<{ field: string; message: string }>;\n requirePluginManager: (runtime: AgentRuntime | null) => PluginManagerLike;\n requireCoreManager: (runtime: AgentRuntime | null) => CoreManagerLike;\n}\n\nconst pluginsListInFlight = new WeakMap<\n PluginRouteContext[\"state\"],\n Promise<PluginEntry[]>\n>();\n\nfunction readCompatEnabledFromConfig(\n config: ElizaConfig,\n pluginId: string,\n): boolean | null {\n const container =\n asRecord(config.connectors)?.[pluginId] ??\n asRecord(config.streaming)?.[pluginId];\n const value = asRecord(container)?.enabled;\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction buildCoreToggleDiagnostics(\n config: ElizaConfig,\n npmName: string,\n): CoreToggleDriftDiagnostic | null {\n const pluginId = optionalPluginListId(npmName);\n const isOptional = (OPTIONAL_CORE_PLUGINS as readonly string[]).includes(\n npmName,\n );\n if (!isOptional) {\n return null;\n }\n const allowList = new Set(config.plugins?.allow ?? []);\n const enabledAllowList = allowList.has(npmName) || allowList.has(pluginId);\n const entryEnabledRaw = config.plugins?.entries?.[pluginId]?.enabled;\n const enabledEntries =\n typeof entryEnabledRaw === \"boolean\" ? entryEnabledRaw : null;\n const enabledCompat = readCompatEnabledFromConfig(config, pluginId);\n const driftFlags: CoreToggleDriftFlag[] = [];\n\n if (enabledEntries !== null && enabledEntries !== enabledAllowList) {\n driftFlags.push(\"entries_vs_allowlist\");\n }\n if (\n enabledEntries !== null &&\n enabledCompat !== null &&\n enabledEntries !== enabledCompat\n ) {\n driftFlags.push(\"entries_vs_compat\");\n }\n\n return {\n pluginId,\n npmName,\n enabled_allowlist: enabledAllowList,\n enabled_entries: enabledEntries,\n enabled_compat: enabledCompat,\n drift_flags: driftFlags,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Route handler\n// ---------------------------------------------------------------------------\n\n/**\n * Handle plugin management routes (/api/plugins/*, /api/secrets, /api/core/*).\n * Returns `true` if the request was handled.\n */\nexport async function handlePluginRoutes(\n ctx: PluginRouteContext,\n): Promise<boolean> {\n const {\n req,\n res,\n method,\n pathname,\n state,\n json,\n error,\n readJsonBody,\n scheduleRuntimeRestart,\n restartRuntime,\n BLOCKED_ENV_KEYS,\n discoverInstalledPlugins,\n maskValue,\n aggregateSecrets,\n readProviderCache,\n paramKeyToCategory,\n buildPluginEvmDiagnosticEntry,\n EVM_PLUGIN_PACKAGE,\n applyWhatsAppQrOverride,\n applySignalQrOverride,\n resolvePluginConfigMutationRejections,\n requirePluginManager,\n requireCoreManager,\n } = ctx;\n\n const buildPluginsListSnapshot = async (): Promise<PluginEntry[]> => {\n let freshConfig: ElizaConfig;\n try {\n freshConfig = loadElizaConfig();\n } catch {\n freshConfig = state.config;\n }\n\n const bundledIds = new Set(state.plugins.map((p) => p.id));\n const installedEntries = discoverInstalledPlugins(freshConfig, bundledIds);\n const allPlugins: PluginEntry[] = [...state.plugins, ...installedEntries];\n let installedMetadataByName = new Map<\n string,\n {\n version?: string;\n releaseStream?: \"latest\" | \"beta\";\n requestedVersion?: string;\n latestVersion?: string | null;\n betaVersion?: string | null;\n }\n >();\n let registryMetadataByName = new Map<string, RegistryPluginInfo>();\n try {\n const pluginManager = requirePluginManager(state.runtime);\n const installed = await pluginManager.listInstalledPlugins();\n installedMetadataByName = new Map(\n installed.map((plugin) => [\n plugin.name,\n {\n version: plugin.version,\n releaseStream: plugin.releaseStream,\n requestedVersion: plugin.requestedVersion,\n latestVersion: plugin.latestVersion,\n betaVersion: plugin.betaVersion,\n },\n ]),\n );\n\n const registry = await pluginManager.refreshRegistry();\n registryMetadataByName = new Map<string, RegistryPluginInfo>();\n for (const [key, info] of registry) {\n for (const candidate of [key, info.name, info.npm.package]) {\n const normalized = normalizeRegistryLookupKey(candidate);\n if (normalized) registryMetadataByName.set(normalized, info);\n }\n }\n } catch {\n // Keep the plugin list working even when the plugin-manager service is unavailable.\n }\n const evmDiagnostic = buildPluginEvmDiagnosticEntry({\n config: state.config,\n runtime: state.runtime,\n });\n const existingEvmPlugin = allPlugins.find(\n (plugin) =>\n plugin.id === \"evm\" ||\n plugin.id === \"wallet\" ||\n plugin.npmName === EVM_PLUGIN_PACKAGE,\n );\n if (existingEvmPlugin) {\n existingEvmPlugin.autoEnabled = evmDiagnostic.autoEnabled;\n existingEvmPlugin.managementMode = \"core-optional\";\n existingEvmPlugin.capabilityStatus = evmDiagnostic.capabilityStatus;\n existingEvmPlugin.capabilityReason = evmDiagnostic.capabilityReason;\n existingEvmPlugin.prerequisites = evmDiagnostic.prerequisites;\n existingEvmPlugin.setupGuideUrl =\n existingEvmPlugin.setupGuideUrl ?? evmDiagnostic.setupGuideUrl;\n existingEvmPlugin.tags = Array.from(\n new Set([...existingEvmPlugin.tags, ...evmDiagnostic.tags]),\n );\n } else {\n allPlugins.push(evmDiagnostic);\n }\n\n const configEntries = (\n freshConfig.plugins as Record<string, unknown> | undefined\n )?.entries as Record<string, { enabled?: boolean }> | undefined;\n const advancedCapabilitiesEnabled =\n resolveAdvancedCapabilitiesEnabled(freshConfig);\n const loadedNames = state.runtime\n ? state.runtime.plugins.map((p) => p.name)\n : [];\n for (const plugin of allPlugins) {\n applyRegistryMetadata(plugin, registryMetadataByName);\n\n const installedMetadata =\n (plugin.npmName ? installedMetadataByName.get(plugin.npmName) : null) ??\n installedMetadataByName.get(plugin.name);\n if (installedMetadata) {\n plugin.version = installedMetadata.version ?? plugin.version;\n plugin.releaseStream =\n installedMetadata.releaseStream ?? plugin.releaseStream;\n plugin.requestedVersion =\n installedMetadata.requestedVersion ?? plugin.requestedVersion;\n plugin.latestVersion =\n installedMetadata.latestVersion ?? plugin.latestVersion ?? null;\n plugin.betaVersion =\n installedMetadata.betaVersion ?? plugin.betaVersion ?? null;\n }\n\n if (isAdvancedCapabilityPluginId(plugin.id)) {\n const serviceType = ADVANCED_CAPABILITY_SERVICE_BY_PLUGIN_ID[plugin.id];\n plugin.enabled = advancedCapabilitiesEnabled;\n plugin.isActive = advancedCapabilitiesEnabled\n ? serviceType\n ? Boolean(state.runtime?.getService(serviceType))\n : Boolean(state.runtime)\n : false;\n plugin.autoEnabled = advancedCapabilitiesEnabled;\n plugin.loadError = undefined;\n continue;\n }\n\n const suffix = `plugin-${plugin.id}`;\n const packageName = `@elizaos/plugin-${plugin.id}`;\n const npmPkgName = plugin.npmName;\n const isLoaded =\n loadedNames.length > 0 &&\n loadedNames.some((name) => {\n return (\n name === plugin.id ||\n name === suffix ||\n name === packageName ||\n (npmPkgName != null && name === npmPkgName) ||\n name.endsWith(`/${suffix}`)\n );\n });\n plugin.isActive = isLoaded;\n const configEntry = configEntries?.[plugin.id];\n if (configEntry && typeof configEntry.enabled === \"boolean\") {\n plugin.enabled = configEntry.enabled;\n } else {\n plugin.enabled = isLoaded;\n }\n plugin.loadError = undefined;\n if (plugin.enabled && !isLoaded && state.runtime) {\n const installs = freshConfig.plugins?.installs as\n | Record<string, unknown>\n | undefined;\n const packageName = `@elizaos/plugin-${plugin.id}`;\n const hasInstallRecord =\n installs?.[packageName] || installs?.[plugin.id];\n if (hasInstallRecord) {\n plugin.loadError =\n \"Plugin installed but failed to load — the package may be missing compiled files.\";\n }\n }\n if (\n plugin.id === \"evm\" ||\n plugin.id === \"wallet\" ||\n plugin.npmName === EVM_PLUGIN_PACKAGE\n ) {\n plugin.enabled = evmDiagnostic.enabled;\n plugin.isActive = evmDiagnostic.isActive;\n plugin.autoEnabled = evmDiagnostic.autoEnabled;\n plugin.managementMode = \"core-optional\";\n plugin.capabilityStatus = evmDiagnostic.capabilityStatus;\n plugin.capabilityReason = evmDiagnostic.capabilityReason;\n plugin.prerequisites = evmDiagnostic.prerequisites;\n }\n }\n\n for (const plugin of allPlugins) {\n for (const param of plugin.parameters) {\n const envValue = process.env[param.key];\n param.isSet = Boolean(envValue?.trim());\n param.currentValue = param.isSet\n ? param.sensitive\n ? maskValue(envValue ?? \"\")\n : (envValue ?? \"\")\n : null;\n }\n const paramInfos: PluginParamInfo[] = plugin.parameters.map((p) => ({\n key: p.key,\n required: p.required,\n sensitive: p.sensitive,\n type: p.type,\n description: p.description,\n default: p.default,\n }));\n const validation = validatePluginConfig(\n plugin.id,\n plugin.category,\n plugin.envKey,\n plugin.configKeys,\n undefined,\n paramInfos,\n );\n plugin.validationErrors = validation.errors;\n plugin.validationWarnings = validation.warnings;\n }\n\n applyWhatsAppQrOverride(allPlugins, resolveDefaultAgentWorkspaceDir());\n applySignalQrOverride(allPlugins, resolveDefaultAgentWorkspaceDir());\n\n for (const plugin of allPlugins) {\n const providerModels = readProviderCache(plugin.id)?.models ?? [];\n\n for (const param of plugin.parameters) {\n if (!param.key.toUpperCase().includes(\"MODEL\")) continue;\n\n const expectedCat = paramKeyToCategory(param.key);\n const filtered = providerModels.filter(\n (m) => m.category === expectedCat,\n );\n\n if (!plugin.configUiHints) plugin.configUiHints = {};\n plugin.configUiHints[param.key] = {\n ...plugin.configUiHints[param.key],\n type: \"select\",\n options: filtered.map((m) => ({\n value: m.id,\n label: m.name !== m.id ? `${m.name} (${m.id})` : m.id,\n })),\n };\n }\n }\n\n // Attach widget declarations from each plugin instance's own `widgets`\n // field, with the agent compatibility map as a final empty fallback.\n const runtimePlugins = state.runtime?.plugins ?? [];\n const normalizeId = (value: string): string => {\n let v = value.trim();\n if (v.startsWith(\"@\")) {\n const slash = v.indexOf(\"/\");\n if (slash > 0) v = v.slice(slash + 1);\n }\n if (v.startsWith(\"plugin-\")) v = v.slice(\"plugin-\".length);\n if (v.startsWith(\"app-\")) v = v.slice(\"app-\".length);\n return v;\n };\n for (const plugin of allPlugins) {\n const widgets = getPluginWidgets(plugin.id, runtimePlugins);\n if (widgets.length > 0) {\n plugin.widgets = widgets;\n }\n const normalizedPluginId = normalizeId(plugin.id);\n const matchedRuntime = runtimePlugins.find(\n (p) => normalizeId(p.name) === normalizedPluginId,\n );\n if (matchedRuntime?.app) {\n const a = matchedRuntime.app;\n plugin.app = {\n displayName: a.displayName,\n category: a.category,\n icon: a.icon,\n developerOnly: a.developerOnly,\n visibleInAppStore: a.visibleInAppStore,\n navTabs: a.navTabs?.map((t) => ({\n id: t.id,\n label: t.label,\n icon: t.icon,\n path: t.path,\n order: t.order,\n developerOnly: t.developerOnly,\n group: t.group,\n componentExport: t.componentExport,\n })),\n };\n }\n }\n\n return allPlugins;\n };\n\n const resolvePluginsSnapshot = async (\n config: ElizaConfig,\n ): Promise<ResolvedPlugin[]> => {\n const { resolvePlugins } = await import(\"@elizaos/agent\");\n return resolvePlugins(config, { quiet: true });\n };\n\n const resolvePluginsSnapshotSafe = async (\n config: ElizaConfig,\n reason: string,\n ): Promise<ResolvedPlugin[] | undefined> => {\n try {\n return await resolvePluginsSnapshot(config);\n } catch (err) {\n logger.warn(\n `[plugin-routes] Failed to resolve plugin snapshot for ${reason}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return undefined;\n }\n };\n\n const npmNamePattern =\n /^(@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/;\n\n const validateRegistryPluginPackageName = (\n pluginName: string,\n ): string | null => {\n const trimmedName = pluginName.trim();\n if (!trimmedName) {\n return \"Request body must include 'name' (plugin package name)\";\n }\n if (!npmNamePattern.test(trimmedName)) {\n return \"Invalid plugin name format\";\n }\n return null;\n };\n\n // ── GET /api/plugins ────────────────────────────────────────────────────\n if (method === \"GET\" && pathname === \"/api/plugins\") {\n let inFlight = pluginsListInFlight.get(state);\n if (!inFlight) {\n inFlight = buildPluginsListSnapshot();\n pluginsListInFlight.set(state, inFlight);\n }\n const allPlugins = await inFlight.finally(() => {\n pluginsListInFlight.delete(state);\n });\n json(res, { plugins: allPlugins });\n return true;\n }\n\n // ── PUT /api/plugins/:id ────────────────────────────────────────────────\n if (method === \"PUT\" && pathname.startsWith(\"/api/plugins/\")) {\n const pluginId = pathname.slice(\"/api/plugins/\".length);\n const rawPlugin = await readJsonBody<Record<string, unknown>>(req, res);\n if (rawPlugin === null) return true;\n const parsedPlugin = PutPluginRequestSchema.safeParse(rawPlugin);\n if (!parsedPlugin.success) {\n error(\n res,\n parsedPlugin.error.issues[0]?.message ?? \"Invalid request body\",\n 400,\n );\n return true;\n }\n const body = parsedPlugin.data;\n\n if (isElizaSettingsDebugEnabled()) {\n logger.debug(\n `[eliza][settings][api] PUT /api/plugins/${pluginId} body=${JSON.stringify(\n sanitizeForSettingsDebug({\n enabled: body.enabled,\n configKeys: body.config ? Object.keys(body.config).sort() : [],\n config: body.config ?? {},\n }),\n )}`,\n );\n }\n\n // Search both bundled plugins AND store-installed plugins\n let plugin = state.plugins.find((p) => p.id === pluginId);\n if (!plugin) {\n // Check store-installed plugins from config\n let freshCfg: ElizaConfig;\n try {\n freshCfg = loadElizaConfig();\n } catch {\n freshCfg = state.config;\n }\n const bundledIds = new Set(state.plugins.map((p) => p.id));\n const installed = discoverInstalledPlugins(freshCfg, bundledIds);\n const found = installed.find((p) => p.id === pluginId);\n if (found) {\n // Temporarily add to state.plugins so toggle logic works the same way\n state.plugins.push(found);\n plugin = found;\n }\n }\n if (!plugin) {\n error(res, `Plugin \"${pluginId}\" not found`, 404);\n return true;\n }\n\n const previousConfig = structuredClone(state.config);\n const previousResolvedPlugins = state.runtime\n ? await resolvePluginsSnapshotSafe(previousConfig, \"plugin update\")\n : undefined;\n\n if (body.enabled !== undefined) {\n plugin.enabled = body.enabled;\n }\n if (body.config) {\n const configRejections = resolvePluginConfigMutationRejections(\n plugin.parameters,\n body.config,\n );\n if (configRejections.length > 0) {\n json(\n res,\n { ok: false, plugin, validationErrors: configRejections },\n 422,\n );\n return true;\n }\n\n // Only validate the fields actually being submitted — not all required\n // fields. Users may save partial config (e.g. just the API key) from\n // the Settings page; blocking the save because OTHER required fields\n // aren't set yet is counterproductive.\n const configObj = body.config;\n const submittedParamInfos: PluginParamInfo[] = plugin.parameters\n .filter((p) => p.key in configObj)\n .map((p) => ({\n key: p.key,\n required: p.required,\n sensitive: p.sensitive,\n type: p.type,\n description: p.description,\n default: p.default,\n }));\n const configValidation = validatePluginConfig(\n pluginId,\n plugin.category,\n plugin.envKey,\n plugin.configKeys,\n body.config,\n submittedParamInfos,\n );\n\n if (!configValidation.valid) {\n json(\n res,\n { ok: false, plugin, validationErrors: configValidation.errors },\n 422,\n );\n return true;\n }\n\n const allowedParamKeys = new Set(plugin.parameters.map((p) => p.key));\n const allowedParamsByKey = new Map(\n plugin.parameters.map((p) => [p.key, p]),\n );\n\n // Persist config values to state.config.env so they survive restarts\n if (!state.config.env) {\n state.config.env = {};\n }\n if (!state.config.plugins) {\n state.config.plugins = {};\n }\n if (!state.config.plugins.entries) {\n (state.config.plugins as Record<string, unknown>).entries = {};\n }\n const entries = (state.config.plugins as Record<string, unknown>)\n .entries as Record<string, Record<string, unknown>>;\n const pluginEntry = entries[pluginId] ?? {};\n const nextPluginConfig = asRecord(pluginEntry.config)\n ? { ...(pluginEntry.config as Record<string, unknown>) }\n : {};\n let touchedPluginConfig = false;\n\n for (const [key, value] of Object.entries(body.config)) {\n if (\n allowedParamKeys.has(key) &&\n !BLOCKED_ENV_KEYS.has(key.toUpperCase()) &&\n typeof value === \"string\"\n ) {\n touchedPluginConfig = true;\n if (value.trim()) {\n process.env[key] = value;\n (state.config.env as Record<string, unknown>)[key] = value;\n nextPluginConfig[key] = value;\n } else if (!allowedParamsByKey.get(key)?.required) {\n delete process.env[key];\n delete (state.config.env as Record<string, unknown>)[key];\n delete nextPluginConfig[key];\n }\n }\n }\n if (touchedPluginConfig) {\n pluginEntry.config = nextPluginConfig;\n entries[pluginId] = pluginEntry;\n }\n plugin.configured = true;\n\n // Save config even when only config values changed (no enable toggle)\n if (body.enabled === undefined) {\n try {\n saveElizaConfig(state.config);\n } catch (err) {\n logger.warn(\n `[eliza-api] Failed to save config: ${err instanceof Error ? err.message : err}`,\n );\n }\n }\n }\n\n // Refresh validation\n const refreshParamInfos: PluginParamInfo[] = plugin.parameters.map((p) => ({\n key: p.key,\n required: p.required,\n sensitive: p.sensitive,\n type: p.type,\n description: p.description,\n default: p.default,\n }));\n const updated = validatePluginConfig(\n pluginId,\n plugin.category,\n plugin.envKey,\n plugin.configKeys,\n undefined,\n refreshParamInfos,\n );\n plugin.validationErrors = updated.errors;\n plugin.validationWarnings = updated.warnings;\n\n // Update config.plugins.entries so the runtime loads/skips this plugin\n if (body.enabled !== undefined) {\n if (isAdvancedCapabilityPluginId(pluginId)) {\n applyAdvancedCapabilitiesConfig(state.config, body.enabled);\n for (const candidate of state.plugins) {\n if (isAdvancedCapabilityPluginId(candidate.id)) {\n candidate.enabled = body.enabled;\n }\n }\n\n logger.info(\n `[eliza-api] ${body.enabled ? \"Enabled\" : \"Disabled\"} advanced capabilities via plugin alias: ${pluginId}`,\n );\n } else {\n const packageName = `@elizaos/plugin-${pluginId}`;\n\n if (!state.config.plugins) {\n state.config.plugins = {};\n }\n if (!state.config.plugins.entries) {\n (state.config.plugins as Record<string, unknown>).entries = {};\n }\n\n const entries = (state.config.plugins as Record<string, unknown>)\n .entries as Record<string, Record<string, unknown>>;\n entries[pluginId] = { enabled: body.enabled };\n\n // Keep plugins.allow aligned with entries[pluginId].enabled so the\n // enable-state drift check in buildCoreToggleDiagnostics() stays clean.\n state.config.plugins.allow = state.config.plugins.allow ?? [];\n const allow = state.config.plugins.allow;\n if (body.enabled) {\n if (!allow.includes(pluginId) && !allow.includes(packageName)) {\n allow.push(pluginId);\n }\n } else {\n state.config.plugins.allow = allow.filter(\n (p: string) => p !== pluginId && p !== packageName,\n );\n }\n\n logger.info(\n `[eliza-api] ${body.enabled ? \"Enabled\" : \"Disabled\"} plugin: ${packageName}`,\n );\n }\n\n // Persist capability toggle state in config.features so the runtime\n // can gate related behaviour (e.g. disabling image description when\n // vision is toggled off).\n const CAPABILITY_FEATURE_IDS = new Set([\n \"vision\",\n \"browser\",\n \"computeruse\",\n \"coding-agent\",\n ]);\n if (CAPABILITY_FEATURE_IDS.has(pluginId)) {\n if (!state.config.features) {\n state.config.features = {};\n }\n state.config.features[pluginId] = body.enabled;\n }\n\n // Save updated config\n try {\n saveElizaConfig(state.config);\n } catch (err) {\n logger.warn(\n `[eliza-api] Failed to save config: ${err instanceof Error ? err.message : err}`,\n );\n }\n }\n\n const runtimeApply = await applyPluginRuntimeMutation({\n runtime: state.runtime,\n previousConfig,\n nextConfig: state.config,\n previousResolvedPlugins,\n changedPluginId: pluginId,\n changedPluginPackage: plugin.npmName,\n config: body.config,\n expectRuntimeGraphChange: body.enabled !== undefined,\n reason:\n body.enabled !== undefined\n ? `Plugin toggle: ${pluginId}`\n : `Plugin config updated: ${pluginId}`,\n restartRuntime,\n });\n\n if (runtimeApply.requiresRestart) {\n scheduleRuntimeRestart(runtimeApply.reason);\n }\n\n if (isElizaSettingsDebugEnabled()) {\n const cloud = (state.config as Record<string, unknown>).cloud as\n | Record<string, unknown>\n | undefined;\n logger.debug(\n `[eliza][settings][api] PUT /api/plugins/${pluginId} → done configured=${plugin.configured} enabled=${plugin.enabled} cloud=${JSON.stringify(settingsDebugCloudSummary(cloud))}`,\n );\n }\n\n json(res, {\n ok: true,\n plugin,\n applied: runtimeApply.mode,\n requiresRestart: runtimeApply.requiresRestart,\n restartedRuntime: runtimeApply.restartedRuntime,\n loadedPackages: runtimeApply.loadedPackages,\n unloadedPackages: runtimeApply.unloadedPackages,\n reloadedPackages: runtimeApply.reloadedPackages,\n });\n return true;\n }\n\n // ── GET /api/secrets ─────────────────────────────────────────────────\n if (method === \"GET\" && pathname === \"/api/secrets\") {\n // Merge bundled + installed plugins for full parameter coverage\n const bundledIds = new Set(state.plugins.map((p) => p.id));\n const installedEntries = discoverInstalledPlugins(state.config, bundledIds);\n const allPlugins: PluginEntry[] = [...state.plugins, ...installedEntries];\n\n // Sync enabled status from runtime (same logic as GET /api/plugins)\n if (state.runtime) {\n const loadedNames = state.runtime.plugins.map((p) => p.name);\n for (const plugin of allPlugins) {\n const suffix = `plugin-${plugin.id}`;\n const packageName = `@elizaos/plugin-${plugin.id}`;\n plugin.enabled = loadedNames.some(\n (name) =>\n name === plugin.id ||\n name === suffix ||\n name === packageName ||\n name.endsWith(`/${suffix}`),\n );\n }\n }\n\n const secrets = aggregateSecrets(allPlugins);\n json(res, { secrets });\n return true;\n }\n\n // ── PUT /api/secrets ─────────────────────────────────────────────────\n if (method === \"PUT\" && pathname === \"/api/secrets\") {\n const rawSecrets = await readJsonBody<Record<string, unknown>>(req, res);\n if (rawSecrets === null) return true;\n const parsedSecrets = PutSecretsRequestSchema.safeParse(rawSecrets);\n if (!parsedSecrets.success) {\n error(\n res,\n parsedSecrets.error.issues[0]?.message ?? \"Invalid request body\",\n 400,\n );\n return true;\n }\n const body = parsedSecrets.data;\n\n // Build allowlist from all plugin-declared sensitive params\n const bundledIds = new Set(state.plugins.map((p) => p.id));\n const installedEntries = discoverInstalledPlugins(state.config, bundledIds);\n const allPlugins: PluginEntry[] = [...state.plugins, ...installedEntries];\n const allowedKeys = new Set<string>();\n for (const plugin of allPlugins) {\n for (const param of plugin.parameters) {\n if (param.sensitive) allowedKeys.add(param.key);\n }\n }\n\n const updatedKeys: string[] = [];\n for (const [key, value] of Object.entries(body.secrets)) {\n if (typeof value !== \"string\" || !value.trim()) continue;\n if (!allowedKeys.has(key)) continue;\n if (BLOCKED_ENV_KEYS.has(key.toUpperCase())) continue;\n process.env[key] = value;\n updatedKeys.push(key);\n }\n\n // Mark affected plugins as configured\n for (const plugin of allPlugins) {\n const pluginKeys = new Set(plugin.parameters.map((p) => p.key));\n if (updatedKeys.some((k) => pluginKeys.has(k))) {\n plugin.configured = true;\n }\n }\n\n json(res, { ok: true, updated: updatedKeys });\n return true;\n }\n\n // ── POST /api/plugins/:id/test ────────────────────────────────────────\n // Test a plugin's connection / configuration validity.\n const pluginTestMatch =\n method === \"POST\" && pathname.match(/^\\/api\\/plugins\\/([^/]+)\\/test$/);\n if (pluginTestMatch) {\n const pluginId = decodeURIComponent(pluginTestMatch[1]);\n const startMs = Date.now();\n\n try {\n // Find the plugin in the runtime\n const allPlugins = state.runtime?.plugins ?? [];\n const normalizePluginId = (value: string): string => {\n const scopedPackage = value.match(/^@[^/]+\\/plugin-(.+)$/);\n if (scopedPackage) {\n return scopedPackage[1] ?? value;\n }\n return value.replace(/^@[^/]+\\//, \"\").replace(/^plugin-/, \"\");\n };\n\n const normalizedPluginId = normalizePluginId(pluginId);\n\n const plugin = allPlugins.find((p: { id?: string; name?: string }) => {\n const runtimeName = p.name ?? \"\";\n const runtimeId = normalizePluginId(runtimeName);\n return (\n p.id === pluginId ||\n p.name === pluginId ||\n runtimeId === pluginId ||\n runtimeId === normalizedPluginId\n );\n });\n\n if (!plugin) {\n json(\n res,\n {\n success: false,\n pluginId,\n error: \"Plugin not found or not loaded\",\n durationMs: Date.now() - startMs,\n },\n 404,\n );\n return true;\n }\n\n // Check if plugin exposes a test/health method\n const testFn = getPluginHealthProbe(plugin);\n if (typeof testFn === \"function\") {\n const result = await testFn();\n json(res, {\n success: result.ok !== false,\n pluginId,\n message:\n result.message ??\n (result.ok !== false\n ? \"Connection successful\"\n : \"Connection failed\"),\n durationMs: Date.now() - startMs,\n });\n return true;\n }\n\n // No test function — return a basic \"plugin is loaded\" status\n json(res, {\n success: true,\n pluginId,\n message: \"Plugin is loaded and active (no custom test available)\",\n durationMs: Date.now() - startMs,\n });\n } catch (err) {\n json(\n res,\n {\n success: false,\n pluginId,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startMs,\n },\n 500,\n );\n }\n return true;\n }\n\n // ── POST /api/plugins/install ───────────────────────────────────────────\n // Install a plugin from the registry and restart the agent.\n if (method === \"POST\" && pathname === \"/api/plugins/install\") {\n const rawInstall = await readJsonBody<Record<string, unknown>>(req, res);\n if (rawInstall === null) return true;\n const parsedInstall = PostPluginInstallRequestSchema.safeParse(rawInstall);\n if (!parsedInstall.success) {\n error(\n res,\n parsedInstall.error.issues[0]?.message ?? \"Invalid request body\",\n 400,\n );\n return true;\n }\n const body = parsedInstall.data;\n const pluginName = body.name;\n\n const installValidationError =\n validateRegistryPluginPackageName(pluginName);\n if (installValidationError) {\n error(res, installValidationError, 400);\n return true;\n }\n\n try {\n const previousConfig = structuredClone(state.config);\n const previousResolvedPlugins = state.runtime\n ? await resolvePluginsSnapshotSafe(previousConfig, \"plugin install\")\n : undefined;\n const pluginManager = requirePluginManager(state.runtime);\n const result = await pluginManager.installPlugin(\n pluginName,\n (progress: InstallProgressLike) => {\n logger.info(`[install] ${progress.phase}: ${progress.message}`);\n state.broadcastWs?.({\n type: \"install-progress\",\n pluginName: progress.pluginName,\n phase: progress.phase,\n message: progress.message,\n });\n },\n {\n releaseStream: body.stream,\n version: body.version,\n },\n );\n\n if (!result.success) {\n json(res, { ok: false, error: result.error }, 422);\n return true;\n }\n\n // Auto-enable the newly installed plugin so the runtime loads it after restart.\n const installedId = result.pluginName\n .replace(/^@[^/]+\\/plugin-/, \"\")\n .replace(/^@[^/]+\\//, \"\")\n .replace(/^plugin-/, \"\");\n if (!state.config.plugins) {\n state.config.plugins = {};\n }\n if (!state.config.plugins.entries) {\n (state.config.plugins as Record<string, unknown>).entries = {};\n }\n const pluginEntries = (state.config.plugins as Record<string, unknown>)\n .entries as Record<string, Record<string, unknown>>;\n pluginEntries[installedId] = { enabled: true };\n\n // Record the install path so plugin-resolver can find the package.\n // Without this, the downloaded package in ~/.eliza/plugins/installed/\n // is invisible to the runtime loader.\n if (result.installPath) {\n if (\n !(state.config.plugins as Record<string, unknown>).installs ||\n typeof (state.config.plugins as Record<string, unknown>).installs !==\n \"object\"\n ) {\n (state.config.plugins as Record<string, unknown>).installs = {};\n }\n const installs = (state.config.plugins as Record<string, unknown>)\n .installs as Record<string, Record<string, unknown>>;\n installs[result.pluginName] = {\n source: \"npm\",\n requestedVersion: result.requestedVersion,\n releaseStream: result.releaseStream,\n installPath: result.installPath,\n version: result.version,\n installedAt: new Date().toISOString(),\n };\n }\n\n try {\n saveElizaConfig(state.config);\n } catch (err) {\n logger.warn(\n `[eliza-api] Failed to save config after install: ${err instanceof Error ? err.message : err}`,\n );\n }\n\n const runtimeApply = await applyPluginRuntimeMutation({\n runtime: state.runtime,\n previousConfig,\n nextConfig: state.config,\n previousResolvedPlugins,\n changedPluginId: installedId,\n changedPluginPackage: result.pluginName,\n expectRuntimeGraphChange: true,\n reason: `Plugin ${result.pluginName} installed`,\n restartRuntime,\n });\n\n if (runtimeApply.requiresRestart && body.autoRestart !== false) {\n scheduleRuntimeRestart(runtimeApply.reason);\n }\n\n json(res, {\n ok: true,\n pluginName: result.pluginName,\n plugin: {\n name: result.pluginName,\n version: result.version,\n installPath: result.installPath,\n },\n applied: runtimeApply.mode,\n requiresRestart: runtimeApply.requiresRestart,\n restartedRuntime: runtimeApply.restartedRuntime,\n loadedPackages: runtimeApply.loadedPackages,\n unloadedPackages: runtimeApply.unloadedPackages,\n reloadedPackages: runtimeApply.reloadedPackages,\n releaseStream: result.releaseStream,\n requestedVersion: result.requestedVersion,\n latestVersion: result.latestVersion,\n betaVersion: result.betaVersion,\n message: runtimeApply.requiresRestart\n ? `${result.pluginName} installed. Restart required to activate.`\n : `${result.pluginName} installed.`,\n });\n } catch (err) {\n error(\n res,\n `Install failed: ${err instanceof Error ? err.message : String(err)}`,\n 500,\n );\n }\n return true;\n }\n\n // ── POST /api/plugins/update ────────────────────────────────────────────\n if (method === \"POST\" && pathname === \"/api/plugins/update\") {\n const rawUpdate = await readJsonBody<Record<string, unknown>>(req, res);\n if (rawUpdate === null) return true;\n const parsedUpdate = PostPluginUpdateRequestSchema.safeParse(rawUpdate);\n if (!parsedUpdate.success) {\n error(\n res,\n parsedUpdate.error.issues[0]?.message ?? \"Invalid request body\",\n 400,\n );\n return true;\n }\n const body = parsedUpdate.data;\n const pluginName = body.name;\n\n const updateValidationError = validateRegistryPluginPackageName(pluginName);\n if (updateValidationError) {\n error(res, updateValidationError, 400);\n return true;\n }\n\n try {\n const previousConfig = structuredClone(state.config);\n const previousResolvedPlugins = state.runtime\n ? await resolvePluginsSnapshotSafe(previousConfig, \"plugin update\")\n : undefined;\n const pluginManager = requirePluginManager(state.runtime);\n const updatePlugin =\n typeof pluginManager.updatePlugin === \"function\"\n ? pluginManager.updatePlugin.bind(pluginManager)\n : pluginManager.installPlugin.bind(pluginManager);\n const result = await updatePlugin(\n pluginName,\n (progress: InstallProgressLike) => {\n logger.info(`[update] ${progress.phase}: ${progress.message}`);\n state.broadcastWs?.({\n type: \"install-progress\",\n pluginName: progress.pluginName,\n phase: progress.phase,\n message: progress.message,\n });\n },\n {\n releaseStream: body.stream,\n version: body.version,\n },\n );\n\n if (!result.success) {\n json(res, { ok: false, error: result.error }, 422);\n return true;\n }\n\n if (!state.config.plugins) {\n state.config.plugins = {};\n }\n if (!state.config.plugins.entries) {\n state.config.plugins.entries = {};\n }\n const updatedId = result.pluginName\n .replace(/^@[^/]+\\/plugin-/, \"\")\n .replace(/^@[^/]+\\//, \"\")\n .replace(/^plugin-/, \"\");\n state.config.plugins.entries[updatedId] = { enabled: true };\n state.config.plugins.installs = state.config.plugins.installs ?? {};\n state.config.plugins.installs[result.pluginName] = {\n source: \"npm\",\n requestedVersion: result.requestedVersion,\n releaseStream: result.releaseStream,\n installPath: result.installPath,\n version: result.version,\n installedAt: new Date().toISOString(),\n };\n\n try {\n saveElizaConfig(state.config);\n } catch (err) {\n logger.warn(\n `[eliza-api] Failed to save config after update: ${err instanceof Error ? err.message : err}`,\n );\n }\n\n const runtimeApply = await applyPluginRuntimeMutation({\n runtime: state.runtime,\n previousConfig,\n nextConfig: state.config,\n previousResolvedPlugins,\n changedPluginId: updatedId,\n changedPluginPackage: result.pluginName,\n forceReloadPackages: [result.pluginName],\n expectRuntimeGraphChange: true,\n reason: `Plugin ${result.pluginName} updated`,\n restartRuntime,\n });\n\n if (runtimeApply.requiresRestart && body.autoRestart !== false) {\n scheduleRuntimeRestart(runtimeApply.reason);\n }\n\n json(res, {\n ok: true,\n pluginName: result.pluginName,\n plugin: {\n name: result.pluginName,\n version: result.version,\n installPath: result.installPath,\n },\n applied: runtimeApply.mode,\n requiresRestart: runtimeApply.requiresRestart,\n restartedRuntime: runtimeApply.restartedRuntime,\n loadedPackages: runtimeApply.loadedPackages,\n unloadedPackages: runtimeApply.unloadedPackages,\n reloadedPackages: runtimeApply.reloadedPackages,\n releaseStream: result.releaseStream,\n requestedVersion: result.requestedVersion,\n latestVersion: result.latestVersion,\n betaVersion: result.betaVersion,\n message: runtimeApply.requiresRestart\n ? `${result.pluginName} updated. Restart required to activate.`\n : `${result.pluginName} updated.`,\n });\n } catch (err) {\n error(\n res,\n `Update failed: ${err instanceof Error ? err.message : String(err)}`,\n 500,\n );\n }\n return true;\n }\n\n // ── POST /api/plugins/uninstall ─────────────────────────────────────────\n if (method === \"POST\" && pathname === \"/api/plugins/uninstall\") {\n const rawUninstall = await readJsonBody<Record<string, unknown>>(req, res);\n if (rawUninstall === null) return true;\n const parsedUninstall =\n PostPluginUninstallRequestSchema.safeParse(rawUninstall);\n if (!parsedUninstall.success) {\n error(\n res,\n parsedUninstall.error.issues[0]?.message ?? \"Invalid request body\",\n 400,\n );\n return true;\n }\n const body = parsedUninstall.data;\n const pluginName = body.name;\n\n const uninstallValidationError =\n validateRegistryPluginPackageName(pluginName);\n if (uninstallValidationError) {\n error(res, uninstallValidationError, 400);\n return true;\n }\n\n try {\n const previousConfig = structuredClone(state.config);\n const previousResolvedPlugins = state.runtime\n ? await resolvePluginsSnapshotSafe(previousConfig, \"plugin uninstall\")\n : undefined;\n const pluginManager = requirePluginManager(state.runtime);\n const result = await pluginManager.uninstallPlugin(pluginName);\n\n if (!result.success) {\n json(res, { ok: false, error: result.error }, 422);\n return true;\n }\n\n const removedId = result.pluginName\n .replace(/^@[^/]+\\/plugin-/, \"\")\n .replace(/^@[^/]+\\//, \"\")\n .replace(/^plugin-/, \"\");\n const installs = state.config.plugins?.installs;\n if (installs && typeof installs === \"object\") {\n delete installs[result.pluginName];\n }\n const entries = state.config.plugins?.entries;\n if (entries && typeof entries === \"object\") {\n delete entries[removedId];\n }\n\n try {\n saveElizaConfig(state.config);\n } catch (err) {\n logger.warn(\n `[eliza-api] Failed to save config after uninstall: ${err instanceof Error ? err.message : err}`,\n );\n }\n\n const runtimeApply = await applyPluginRuntimeMutation({\n runtime: state.runtime,\n previousConfig,\n nextConfig: state.config,\n previousResolvedPlugins,\n changedPluginId: removedId,\n changedPluginPackage: result.pluginName,\n expectRuntimeGraphChange: true,\n reason: `Plugin ${pluginName} uninstalled`,\n restartRuntime,\n });\n\n if (runtimeApply.requiresRestart && body.autoRestart !== false) {\n scheduleRuntimeRestart(runtimeApply.reason);\n }\n\n json(res, {\n ok: true,\n pluginName: result.pluginName,\n applied: runtimeApply.mode,\n requiresRestart: runtimeApply.requiresRestart,\n restartedRuntime: runtimeApply.restartedRuntime,\n loadedPackages: runtimeApply.loadedPackages,\n unloadedPackages: runtimeApply.unloadedPackages,\n reloadedPackages: runtimeApply.reloadedPackages,\n message: runtimeApply.requiresRestart\n ? `${pluginName} uninstalled. Restart required.`\n : `${pluginName} uninstalled.`,\n });\n } catch (err) {\n error(\n res,\n `Uninstall failed: ${err instanceof Error ? err.message : String(err)}`,\n 500,\n );\n }\n return true;\n }\n\n // ── POST /api/plugins/:id/eject ─────────────────────────────────────────\n if (method === \"POST\" && pathname.match(/^\\/api\\/plugins\\/[^/]+\\/eject$/)) {\n const pluginName = decodeURIComponent(\n pathname.slice(\"/api/plugins/\".length, pathname.length - \"/eject\".length),\n );\n try {\n const previousConfig = structuredClone(state.config);\n const previousResolvedPlugins = state.runtime\n ? await resolvePluginsSnapshotSafe(previousConfig, \"plugin eject\")\n : undefined;\n const pluginManager = requirePluginManager(state.runtime);\n // Ensure the method exists on the service (it should)\n if (typeof pluginManager.ejectPlugin !== \"function\") {\n throw new Error(\"Plugin manager does not support ejecting plugins\");\n }\n const result = await pluginManager.ejectPlugin(pluginName);\n if (!result.success) {\n json(res, { ok: false, error: result.error }, 422);\n return true;\n }\n const runtimeApply = await applyPluginRuntimeMutation({\n runtime: state.runtime,\n previousConfig,\n nextConfig: state.config,\n previousResolvedPlugins,\n changedPluginId: pluginName,\n changedPluginPackage: result.pluginName,\n forceReloadPackages: [result.pluginName],\n expectRuntimeGraphChange: true,\n reason: `Plugin ${pluginName} ejected`,\n restartRuntime,\n });\n if (runtimeApply.requiresRestart) {\n scheduleRuntimeRestart(runtimeApply.reason);\n }\n json(res, {\n ok: true,\n pluginName: result.pluginName,\n applied: runtimeApply.mode,\n requiresRestart: runtimeApply.requiresRestart,\n restartedRuntime: runtimeApply.restartedRuntime,\n loadedPackages: runtimeApply.loadedPackages,\n unloadedPackages: runtimeApply.unloadedPackages,\n reloadedPackages: runtimeApply.reloadedPackages,\n message: `${pluginName} ejected to local source.`,\n });\n } catch (err) {\n error(\n res,\n `Eject failed: ${err instanceof Error ? err.message : String(err)}`,\n 500,\n );\n }\n return true;\n }\n\n // ── POST /api/plugins/:id/sync ──────────────────────────────────────────\n if (method === \"POST\" && pathname.match(/^\\/api\\/plugins\\/[^/]+\\/sync$/)) {\n const pluginName = decodeURIComponent(\n pathname.slice(\"/api/plugins/\".length, pathname.length - \"/sync\".length),\n );\n try {\n const previousConfig = structuredClone(state.config);\n const previousResolvedPlugins = state.runtime\n ? await resolvePluginsSnapshotSafe(previousConfig, \"plugin sync\")\n : undefined;\n const pluginManager = requirePluginManager(state.runtime);\n if (typeof pluginManager.syncPlugin !== \"function\") {\n throw new Error(\"Plugin manager does not support syncing plugins\");\n }\n const result = await pluginManager.syncPlugin(pluginName);\n if (!result.success) {\n json(res, { ok: false, error: result.error }, 422);\n return true;\n }\n const runtimeApply = await applyPluginRuntimeMutation({\n runtime: state.runtime,\n previousConfig,\n nextConfig: state.config,\n previousResolvedPlugins,\n changedPluginId: pluginName,\n changedPluginPackage: result.pluginName,\n forceReloadPackages: result.requiresRestart ? [result.pluginName] : [],\n expectRuntimeGraphChange: true,\n reason: `Plugin ${pluginName} synced`,\n restartRuntime,\n });\n if (runtimeApply.requiresRestart) {\n scheduleRuntimeRestart(runtimeApply.reason);\n }\n json(res, {\n ok: true,\n pluginName: result.pluginName,\n applied: runtimeApply.mode,\n requiresRestart: runtimeApply.requiresRestart,\n restartedRuntime: runtimeApply.restartedRuntime,\n loadedPackages: runtimeApply.loadedPackages,\n unloadedPackages: runtimeApply.unloadedPackages,\n reloadedPackages: runtimeApply.reloadedPackages,\n message: `${pluginName} synced with upstream.`,\n });\n } catch (err) {\n error(\n res,\n `Sync failed: ${err instanceof Error ? err.message : String(err)}`,\n 500,\n );\n }\n return true;\n }\n\n // ── POST /api/plugins/:id/reinject ──────────────────────────────────────\n if (\n method === \"POST\" &&\n pathname.match(/^\\/api\\/plugins\\/[^/]+\\/reinject$/)\n ) {\n const pluginName = decodeURIComponent(\n pathname.slice(\n \"/api/plugins/\".length,\n pathname.length - \"/reinject\".length,\n ),\n );\n try {\n const previousConfig = structuredClone(state.config);\n const previousResolvedPlugins = state.runtime\n ? await resolvePluginsSnapshotSafe(previousConfig, \"plugin reinject\")\n : undefined;\n const pluginManager = requirePluginManager(state.runtime);\n if (typeof pluginManager.reinjectPlugin !== \"function\") {\n throw new Error(\"Plugin manager does not support reinjecting plugins\");\n }\n const result = await pluginManager.reinjectPlugin(pluginName);\n if (!result.success) {\n json(res, { ok: false, error: result.error }, 422);\n return true;\n }\n const runtimeApply = await applyPluginRuntimeMutation({\n runtime: state.runtime,\n previousConfig,\n nextConfig: state.config,\n previousResolvedPlugins,\n changedPluginId: pluginName,\n changedPluginPackage: result.pluginName,\n forceReloadPackages: [result.pluginName],\n expectRuntimeGraphChange: true,\n reason: `Plugin ${pluginName} reinjected`,\n restartRuntime,\n });\n if (runtimeApply.requiresRestart) {\n scheduleRuntimeRestart(runtimeApply.reason);\n }\n json(res, {\n ok: true,\n pluginName: result.pluginName,\n applied: runtimeApply.mode,\n requiresRestart: runtimeApply.requiresRestart,\n restartedRuntime: runtimeApply.restartedRuntime,\n loadedPackages: runtimeApply.loadedPackages,\n unloadedPackages: runtimeApply.unloadedPackages,\n reloadedPackages: runtimeApply.reloadedPackages,\n message: `${pluginName} restored to registry version.`,\n });\n } catch (err) {\n error(\n res,\n `Reinject failed: ${err instanceof Error ? err.message : String(err)}`,\n 500,\n );\n }\n return true;\n }\n\n // ── GET /api/plugins/installed ──────────────────────────────────────────\n // List plugins that were installed from the registry at runtime.\n if (method === \"GET\" && pathname === \"/api/plugins/installed\") {\n try {\n const pluginManager = requirePluginManager(state.runtime);\n const installed = await pluginManager.listInstalledPlugins();\n json(res, { count: installed.length, plugins: installed });\n } catch (err) {\n error(\n res,\n `Failed to list installed plugins: ${err instanceof Error ? err.message : String(err)}`,\n 500,\n );\n }\n return true;\n }\n\n // ── GET /api/plugins/ejected ────────────────────────────────────────────\n // List plugins ejected to local source checkouts with upstream metadata.\n if (method === \"GET\" && pathname === \"/api/plugins/ejected\") {\n try {\n const pluginManager = requirePluginManager(state.runtime);\n if (typeof pluginManager.listEjectedPlugins !== \"function\") {\n throw new Error(\n \"Plugin manager does not support listing ejected plugins\",\n );\n }\n const plugins = await pluginManager.listEjectedPlugins();\n json(res, { count: plugins.length, plugins });\n } catch (err) {\n error(\n res,\n `Failed to list ejected plugins: ${err instanceof Error ? err.message : String(err)}`,\n 500,\n );\n }\n return true;\n }\n\n // ── GET /api/core/status ────────────────────────────────────────────────\n // Returns whether @elizaos/core is ejected or resolved from npm.\n if (method === \"GET\" && pathname === \"/api/core/status\") {\n try {\n const coreManager = requireCoreManager(state.runtime);\n const coreStatus = await coreManager.getCoreStatus();\n json(res, coreStatus);\n } catch (err) {\n error(\n res,\n `Failed to get core status: ${err instanceof Error ? err.message : String(err)}`,\n 500,\n );\n }\n return true;\n }\n\n // ── GET /api/plugins/core ────────────────────────────────────────────\n // Returns all core and optional core plugins with their loaded/running status.\n if (method === \"GET\" && pathname === \"/api/plugins/core\") {\n // Build a set of loaded plugin names for robust matching.\n // Plugin internal names vary wildly (e.g. \"local-ai\" for plugin-local-embedding,\n // \"coding-tools\" for plugin-coding-tools), so we check loaded names against multiple\n // derived forms of the npm package name.\n const loadedNames: Set<string> = state.runtime\n ? new Set(state.runtime.plugins.map((p: { name: string }) => p.name))\n : new Set<string>();\n\n const isLoaded = (npmName: string): boolean => {\n if (loadedNames.has(npmName)) return true;\n // @elizaos/plugin-foo -> plugin-foo\n const withoutScope = npmName.replace(\"@elizaos/\", \"\");\n if (loadedNames.has(withoutScope)) return true;\n // plugin-foo -> foo\n const shortId = withoutScope.replace(\"plugin-\", \"\");\n if (loadedNames.has(shortId)) return true;\n // Check if ANY loaded name contains the short id or vice versa\n for (const n of loadedNames) {\n if (n.includes(shortId) || shortId.includes(n)) return true;\n }\n return false;\n };\n\n // Check which optional plugins are currently in the allow list\n const allowList = new Set(state.config.plugins?.allow ?? []);\n\n const makeEntry = (npm: string, isCore: boolean) => {\n const id = optionalPluginListId(npm);\n return {\n npmName: npm,\n id,\n name: id\n .split(\"-\")\n .map((w: string) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \"),\n isCore,\n loaded: isLoaded(npm),\n enabled: isCore || allowList.has(npm) || allowList.has(id),\n };\n };\n\n const coreList = CORE_PLUGINS.map((npm: string) => makeEntry(npm, true));\n const optionalList = OPTIONAL_CORE_PLUGINS.map((npm: string) =>\n makeEntry(npm, false),\n );\n\n json(res, { core: coreList, optional: optionalList });\n return true;\n }\n\n // ── POST /api/plugins/core/toggle ─────────────────────────────────────\n // Enable or disable an optional core plugin by updating the allow list.\n if (method === \"POST\" && pathname === \"/api/plugins/core/toggle\") {\n const rawToggle = await readJsonBody<Record<string, unknown>>(req, res);\n if (rawToggle === null) return true;\n const parsedToggle = PostPluginCoreToggleRequestSchema.safeParse(rawToggle);\n if (!parsedToggle.success) {\n error(\n res,\n parsedToggle.error.issues[0]?.message ?? \"Invalid request body\",\n 400,\n );\n return true;\n }\n const body = parsedToggle.data;\n\n // Only allow toggling optional plugins, not core\n const isCorePlugin = (CORE_PLUGINS as readonly string[]).includes(\n body.npmName,\n );\n if (isCorePlugin) {\n error(res, \"Core plugins cannot be disabled\");\n return true;\n }\n const isOptional = (OPTIONAL_CORE_PLUGINS as readonly string[]).includes(\n body.npmName,\n );\n if (!isOptional) {\n error(res, \"Unknown optional plugin\");\n return true;\n }\n\n const previousConfig = structuredClone(state.config);\n const previousResolvedPlugins = state.runtime\n ? await resolvePluginsSnapshotSafe(previousConfig, \"core plugin toggle\")\n : undefined;\n\n // Update the allow list in config\n state.config.plugins = state.config.plugins ?? {};\n state.config.plugins.allow = state.config.plugins.allow ?? [];\n const allow = state.config.plugins.allow;\n const shortId = optionalPluginListId(body.npmName);\n\n if (body.enabled) {\n if (!allow.includes(body.npmName) && !allow.includes(shortId)) {\n allow.push(body.npmName);\n }\n } else {\n state.config.plugins.allow = allow.filter(\n (p: string) => p !== body.npmName && p !== shortId,\n );\n }\n\n // Keep plugins.entries.enabled aligned with the toggle so optional baked-in\n // plugins that use strict `enabled === true` entry rules stay consistent.\n const pluginsRoot = state.config.plugins as Record<string, unknown>;\n const prevEntries =\n (pluginsRoot.entries as\n | Record<string, { enabled?: boolean; [k: string]: unknown }>\n | undefined) ?? {};\n pluginsRoot.entries = {\n ...prevEntries,\n [shortId]: {\n ...prevEntries[shortId],\n enabled: body.enabled,\n },\n };\n\n try {\n saveElizaConfig(state.config);\n } catch (err) {\n logger.warn(\n `[api] Config save failed: ${err instanceof Error ? err.message : err}`,\n );\n }\n\n const runtimeApply = await applyPluginRuntimeMutation({\n runtime: state.runtime,\n previousConfig,\n nextConfig: state.config,\n previousResolvedPlugins,\n changedPluginId: shortId,\n changedPluginPackage: body.npmName,\n expectRuntimeGraphChange: true,\n reason: `Plugin ${shortId} ${body.enabled ? \"enabled\" : \"disabled\"}`,\n restartRuntime,\n });\n\n if (runtimeApply.requiresRestart) {\n scheduleRuntimeRestart(runtimeApply.reason);\n }\n\n json(res, {\n ok: true,\n applied: runtimeApply.mode,\n requiresRestart: runtimeApply.requiresRestart,\n restartedRuntime: runtimeApply.restartedRuntime,\n loadedPackages: runtimeApply.loadedPackages,\n unloadedPackages: runtimeApply.unloadedPackages,\n reloadedPackages: runtimeApply.reloadedPackages,\n diagnostics: (() => {\n const diagnostic = buildCoreToggleDiagnostics(\n state.config,\n body.npmName,\n );\n return diagnostic && diagnostic.drift_flags.length > 0\n ? {\n withDrift: true,\n plugin: diagnostic,\n }\n : undefined;\n })(),\n message: runtimeApply.requiresRestart\n ? `${shortId} ${body.enabled ? \"enabled\" : \"disabled\"}. Restart required.`\n : `${shortId} ${body.enabled ? \"enabled\" : \"disabled\"}.`,\n });\n return true;\n }\n\n return false;\n}\n"],"mappings":"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","names":["packageName"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @elizaos/plugin-registry — public barrel.
|
|
3
|
+
*
|
|
4
|
+
* Consolidated plugin registry surfaces.
|
|
5
|
+
*
|
|
6
|
+
* This plugin owns the plugin-discovery / install / route surfaces that were
|
|
7
|
+
* previously split between `@elizaos/agent` and `@elizaos/app-core`:
|
|
8
|
+
*
|
|
9
|
+
* - `handlePluginRoutes` (agent-tier `/api/plugins/*` handler, formerly
|
|
10
|
+
* `packages/agent/src/api/plugin-routes.ts`)
|
|
11
|
+
* - `handlePluginsCompatRoutes` + `buildPluginListResponse` (app-core
|
|
12
|
+
* compat layer for `/api/agents/:agentId/plugins/*`, formerly
|
|
13
|
+
* `packages/app-core/src/api/plugins-routes.ts`)
|
|
14
|
+
* - `installPlugin` / `uninstallPlugin` / `installAndRestart` /
|
|
15
|
+
* `uninstallAndRestart` / `listInstalledPlugins` forwarders (formerly
|
|
16
|
+
* `packages/app-core/src/services/plugin-installer.ts`)
|
|
17
|
+
*
|
|
18
|
+
* The agent-internal canonical installer implementation (owns config +
|
|
19
|
+
* restart wiring) still lives in `@elizaos/agent` because it depends on
|
|
20
|
+
* agent-private runtime state; consumers should import through this
|
|
21
|
+
* plugin's forwarder rather than reaching across into agent directly.
|
|
22
|
+
*/
|
|
23
|
+
export { buildPluginListResponse, handlePluginsCompatRoutes, } from "./api/app-plugins-routes.ts";
|
|
24
|
+
export { handlePluginRoutes } from "./api/plugin-routes.ts";
|
|
25
|
+
export { type InstallPhase, type InstallProgress, type InstallResult, installAndRestart, installPlugin, listInstalledPlugins, type ProgressCallback, type UninstallResult, uninstallAndRestart, uninstallPlugin, } from "./services/plugin-installer.ts";
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,mBAAmB,EACnB,eAAe,GAChB,MAAM,gCAAgC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildPluginListResponse,
|
|
3
|
+
handlePluginsCompatRoutes
|
|
4
|
+
} from "./api/app-plugins-routes.js";
|
|
5
|
+
import { handlePluginRoutes } from "./api/plugin-routes.js";
|
|
6
|
+
import {
|
|
7
|
+
installAndRestart,
|
|
8
|
+
installPlugin,
|
|
9
|
+
listInstalledPlugins,
|
|
10
|
+
uninstallAndRestart,
|
|
11
|
+
uninstallPlugin
|
|
12
|
+
} from "./services/plugin-installer.js";
|
|
13
|
+
export {
|
|
14
|
+
buildPluginListResponse,
|
|
15
|
+
handlePluginRoutes,
|
|
16
|
+
handlePluginsCompatRoutes,
|
|
17
|
+
installAndRestart,
|
|
18
|
+
installPlugin,
|
|
19
|
+
listInstalledPlugins,
|
|
20
|
+
uninstallAndRestart,
|
|
21
|
+
uninstallPlugin
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @elizaos/plugin-registry — public barrel.\n *\n * Consolidated plugin registry surfaces.\n *\n * This plugin owns the plugin-discovery / install / route surfaces that were\n * previously split between `@elizaos/agent` and `@elizaos/app-core`:\n *\n * - `handlePluginRoutes` (agent-tier `/api/plugins/*` handler, formerly\n * `packages/agent/src/api/plugin-routes.ts`)\n * - `handlePluginsCompatRoutes` + `buildPluginListResponse` (app-core\n * compat layer for `/api/agents/:agentId/plugins/*`, formerly\n * `packages/app-core/src/api/plugins-routes.ts`)\n * - `installPlugin` / `uninstallPlugin` / `installAndRestart` /\n * `uninstallAndRestart` / `listInstalledPlugins` forwarders (formerly\n * `packages/app-core/src/services/plugin-installer.ts`)\n *\n * The agent-internal canonical installer implementation (owns config +\n * restart wiring) still lives in `@elizaos/agent` because it depends on\n * agent-private runtime state; consumers should import through this\n * plugin's forwarder rather than reaching across into agent directly.\n */\n\nexport {\n buildPluginListResponse,\n handlePluginsCompatRoutes,\n} from \"./api/app-plugins-routes.js\";\nexport { handlePluginRoutes } from \"./api/plugin-routes.js\";\nexport {\n type InstallPhase,\n type InstallProgress,\n type InstallResult,\n installAndRestart,\n installPlugin,\n listInstalledPlugins,\n type ProgressCallback,\n type UninstallResult,\n uninstallAndRestart,\n uninstallPlugin,\n} from \"./services/plugin-installer.js\";\n"],"mappings":"AAuBA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,0BAA0B;AACnC;AAAA,EAIE;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@elizaos/app-core/services/plugin-installer` — thin forwarder to the
|
|
3
|
+
* runtime implementation in `@elizaos/agent/services/plugin-installer`.
|
|
4
|
+
*
|
|
5
|
+
* Why the forwarder + lazy load: `@elizaos/agent` already depends on
|
|
6
|
+
* `@elizaos/app-core`. Re-exporting the agent module statically here would
|
|
7
|
+
* create a hard module-graph cycle (`app-core ↔ agent`) that breaks the
|
|
8
|
+
* moment `app-core` is consumed in a context where `@elizaos/agent` is
|
|
9
|
+
* not installed (e.g. a downstream package that only adds `app-core`).
|
|
10
|
+
* Types re-export statically because TypeScript erases them at compile
|
|
11
|
+
* time and never participates in the runtime cycle. The implementations
|
|
12
|
+
* forward through `import()` so the cycle only resolves on first call,
|
|
13
|
+
* when the consumer's bundler has finished walking the static graph.
|
|
14
|
+
*/
|
|
15
|
+
import type { InstallPhase, InstallProgress, InstallResult, ProgressCallback, UninstallResult } from "@elizaos/agent";
|
|
16
|
+
export type { InstallPhase, InstallProgress, InstallResult, ProgressCallback, UninstallResult, };
|
|
17
|
+
export declare function installPlugin(...args: Parameters<typeof import("@elizaos/agent").installPlugin>): ReturnType<typeof import("@elizaos/agent").installPlugin>;
|
|
18
|
+
export declare function installAndRestart(...args: Parameters<typeof import("@elizaos/agent").installAndRestart>): ReturnType<typeof import("@elizaos/agent").installAndRestart>;
|
|
19
|
+
export declare function uninstallPlugin(...args: Parameters<typeof import("@elizaos/agent").uninstallPlugin>): ReturnType<typeof import("@elizaos/agent").uninstallPlugin>;
|
|
20
|
+
export declare function uninstallAndRestart(...args: Parameters<typeof import("@elizaos/agent").uninstallAndRestart>): ReturnType<typeof import("@elizaos/agent").uninstallAndRestart>;
|
|
21
|
+
export declare function listInstalledPlugins(...args: Parameters<typeof import("@elizaos/agent").listInstalledPlugins>): Promise<Awaited<ReturnType<typeof import("@elizaos/agent").listInstalledPlugins>>>;
|
|
22
|
+
//# sourceMappingURL=plugin-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-installer.d.ts","sourceRoot":"","sources":["../../src/services/plugin-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,CAAC;AAUF,wBAAsB,aAAa,CACjC,GAAG,IAAI,EAAE,UAAU,CAAC,cAAc,gBAAgB,EAAE,aAAa,CAAC,GACjE,UAAU,CAAC,cAAc,gBAAgB,EAAE,aAAa,CAAC,CAG3D;AAED,wBAAsB,iBAAiB,CACrC,GAAG,IAAI,EAAE,UAAU,CAAC,cAAc,gBAAgB,EAAE,iBAAiB,CAAC,GACrE,UAAU,CAAC,cAAc,gBAAgB,EAAE,iBAAiB,CAAC,CAG/D;AAED,wBAAsB,eAAe,CACnC,GAAG,IAAI,EAAE,UAAU,CAAC,cAAc,gBAAgB,EAAE,eAAe,CAAC,GACnE,UAAU,CAAC,cAAc,gBAAgB,EAAE,eAAe,CAAC,CAG7D;AAED,wBAAsB,mBAAmB,CACvC,GAAG,IAAI,EAAE,UAAU,CAAC,cAAc,gBAAgB,EAAE,mBAAmB,CAAC,GACvE,UAAU,CAAC,cAAc,gBAAgB,EAAE,mBAAmB,CAAC,CAGjE;AAED,wBAAsB,oBAAoB,CACxC,GAAG,IAAI,EAAE,UAAU,CAAC,cAAc,gBAAgB,EAAE,oBAAoB,CAAC,GACxE,OAAO,CACR,OAAO,CAAC,UAAU,CAAC,cAAc,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,CAC1E,CAGA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
let cached = null;
|
|
2
|
+
async function load() {
|
|
3
|
+
if (cached) return cached;
|
|
4
|
+
cached = await import("@elizaos/agent");
|
|
5
|
+
return cached;
|
|
6
|
+
}
|
|
7
|
+
async function installPlugin(...args) {
|
|
8
|
+
const mod = await load();
|
|
9
|
+
return mod.installPlugin(...args);
|
|
10
|
+
}
|
|
11
|
+
async function installAndRestart(...args) {
|
|
12
|
+
const mod = await load();
|
|
13
|
+
return mod.installAndRestart(...args);
|
|
14
|
+
}
|
|
15
|
+
async function uninstallPlugin(...args) {
|
|
16
|
+
const mod = await load();
|
|
17
|
+
return mod.uninstallPlugin(...args);
|
|
18
|
+
}
|
|
19
|
+
async function uninstallAndRestart(...args) {
|
|
20
|
+
const mod = await load();
|
|
21
|
+
return mod.uninstallAndRestart(...args);
|
|
22
|
+
}
|
|
23
|
+
async function listInstalledPlugins(...args) {
|
|
24
|
+
const mod = await load();
|
|
25
|
+
return mod.listInstalledPlugins(...args);
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
installAndRestart,
|
|
29
|
+
installPlugin,
|
|
30
|
+
listInstalledPlugins,
|
|
31
|
+
uninstallAndRestart,
|
|
32
|
+
uninstallPlugin
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=plugin-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/plugin-installer.ts"],"sourcesContent":["/**\n * `@elizaos/app-core/services/plugin-installer` — thin forwarder to the\n * runtime implementation in `@elizaos/agent/services/plugin-installer`.\n *\n * Why the forwarder + lazy load: `@elizaos/agent` already depends on\n * `@elizaos/app-core`. Re-exporting the agent module statically here would\n * create a hard module-graph cycle (`app-core ↔ agent`) that breaks the\n * moment `app-core` is consumed in a context where `@elizaos/agent` is\n * not installed (e.g. a downstream package that only adds `app-core`).\n * Types re-export statically because TypeScript erases them at compile\n * time and never participates in the runtime cycle. The implementations\n * forward through `import()` so the cycle only resolves on first call,\n * when the consumer's bundler has finished walking the static graph.\n */\n\nimport type {\n InstallPhase,\n InstallProgress,\n InstallResult,\n ProgressCallback,\n UninstallResult,\n} from \"@elizaos/agent\";\n\nexport type {\n InstallPhase,\n InstallProgress,\n InstallResult,\n ProgressCallback,\n UninstallResult,\n};\n\nlet cached: typeof import(\"@elizaos/agent\") | null = null;\n\nasync function load() {\n if (cached) return cached;\n cached = await import(\"@elizaos/agent\");\n return cached;\n}\n\nexport async function installPlugin(\n ...args: Parameters<typeof import(\"@elizaos/agent\").installPlugin>\n): ReturnType<typeof import(\"@elizaos/agent\").installPlugin> {\n const mod = await load();\n return mod.installPlugin(...args);\n}\n\nexport async function installAndRestart(\n ...args: Parameters<typeof import(\"@elizaos/agent\").installAndRestart>\n): ReturnType<typeof import(\"@elizaos/agent\").installAndRestart> {\n const mod = await load();\n return mod.installAndRestart(...args);\n}\n\nexport async function uninstallPlugin(\n ...args: Parameters<typeof import(\"@elizaos/agent\").uninstallPlugin>\n): ReturnType<typeof import(\"@elizaos/agent\").uninstallPlugin> {\n const mod = await load();\n return mod.uninstallPlugin(...args);\n}\n\nexport async function uninstallAndRestart(\n ...args: Parameters<typeof import(\"@elizaos/agent\").uninstallAndRestart>\n): ReturnType<typeof import(\"@elizaos/agent\").uninstallAndRestart> {\n const mod = await load();\n return mod.uninstallAndRestart(...args);\n}\n\nexport async function listInstalledPlugins(\n ...args: Parameters<typeof import(\"@elizaos/agent\").listInstalledPlugins>\n): Promise<\n Awaited<ReturnType<typeof import(\"@elizaos/agent\").listInstalledPlugins>>\n> {\n const mod = await load();\n return mod.listInstalledPlugins(...args);\n}\n"],"mappings":"AA+BA,IAAI,SAAiD;AAErD,eAAe,OAAO;AACpB,MAAI,OAAQ,QAAO;AACnB,WAAS,MAAM,OAAO,gBAAgB;AACtC,SAAO;AACT;AAEA,eAAsB,iBACjB,MACwD;AAC3D,QAAM,MAAM,MAAM,KAAK;AACvB,SAAO,IAAI,cAAc,GAAG,IAAI;AAClC;AAEA,eAAsB,qBACjB,MAC4D;AAC/D,QAAM,MAAM,MAAM,KAAK;AACvB,SAAO,IAAI,kBAAkB,GAAG,IAAI;AACtC;AAEA,eAAsB,mBACjB,MAC0D;AAC7D,QAAM,MAAM,MAAM,KAAK;AACvB,SAAO,IAAI,gBAAgB,GAAG,IAAI;AACpC;AAEA,eAAsB,uBACjB,MAC8D;AACjE,QAAM,MAAM,MAAM,KAAK;AACvB,SAAO,IAAI,oBAAoB,GAAG,IAAI;AACxC;AAEA,eAAsB,wBACjB,MAGH;AACA,QAAM,MAAM,MAAM,KAAK;AACvB,SAAO,IAAI,qBAAqB,GAAG,IAAI;AACzC;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elizaos/plugin-registry",
|
|
3
|
+
"version": "2.0.11-beta.7",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Plugin registry plugin: consolidates plugin discovery, manifest reading, install/uninstall lifecycle, and HTTP routes for plugin management. Owns the cross-package plugin-routes (agent-tier) and plugins-routes (app-core compat-tier) surfaces and the install-orchestration helpers that forward into the agent runtime.",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
"./package.json": "./package.json",
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"eliza-source": {
|
|
12
|
+
"types": "./src/index.ts",
|
|
13
|
+
"import": "./src/index.ts",
|
|
14
|
+
"default": "./src/index.ts"
|
|
15
|
+
},
|
|
16
|
+
"import": "./dist/index.js",
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"typecheck": "tsgo --noEmit -p tsconfig.json",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"build": "bun run build:js && bun run build:types",
|
|
24
|
+
"clean": "rm -rf dist",
|
|
25
|
+
"build:js": "tsup --config ../tsup.plugin-packages.shared.ts",
|
|
26
|
+
"build:types": "tsc --noCheck -p tsconfig.build.json"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@elizaos/core": "2.0.11-beta.7",
|
|
30
|
+
"@elizaos/shared": "2.0.11-beta.7",
|
|
31
|
+
"@elizaos/vault": "2.0.11-beta.7"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"bun-types": "^1.3.12",
|
|
35
|
+
"tsup": "^8.5.1",
|
|
36
|
+
"typescript": "^6.0.3",
|
|
37
|
+
"vitest": "^4.0.18"
|
|
38
|
+
},
|
|
39
|
+
"agentConfig": {
|
|
40
|
+
"pluginType": "elizaos:plugin:1.0.0",
|
|
41
|
+
"pluginParameters": {}
|
|
42
|
+
},
|
|
43
|
+
"elizaos": {
|
|
44
|
+
"plugin": {
|
|
45
|
+
"capabilities": [
|
|
46
|
+
"plugin-registry"
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
},
|
|
53
|
+
"types": "./dist/index.d.ts",
|
|
54
|
+
"files": [
|
|
55
|
+
"dist"
|
|
56
|
+
],
|
|
57
|
+
"gitHead": "cdbc876f793d96073d7eb0d09715a031ce0cd32e"
|
|
58
|
+
}
|