fix(plugin-sdk): keep published pre-split plugin imports loading after upgrade (#124086)

* fix(plugin-sdk): keep published pre-split plugin imports loading after upgrade

Same bug class as #124041: published plugin artifacts import SDK names at
module top level, so removing them from the barrel makes the installed
plugin fail to load (voice-call/matrix doctor contracts silently never run
their migrations; whatsapp and slack channels fail outright) after a core
upgrade. Verified against the actual npm tarballs (2026.7.2-beta.7):

- openclaw/plugin-sdk/runtime-doctor: voice-call + matrix doctor contracts
  import repair names (archiveLegacyStateSource, detect/repair state DB
  schema, plugin install-path repair, removePluginFromConfig,
  createPluginStateSyncKeyedStore) that moved to doctor-repair-runtime.
- openclaw/plugin-sdk/channel-feedback: whatsapp imports
  shouldAckReactionForWhatsApp (owner policy moved in-plugin by #121257).
- openclaw/plugin-sdk/channel-outbound: slack imports
  resolveChannelProgressDraftRender (render key retired by #122927).

Adds deprecated load-only bridges with named removal windows, bumps the
SDK surface budgets with comments, and locks behavior with unit tests
plus a loader fixture that fails without the bridges.

* test(plugin-sdk): cover the repair bridge in the runtime-doctor facade surface lock
This commit is contained in:
Peter Steinberger
2026-08-15 01:05:08 -07:00
committed by GitHub
parent f4871eb86b
commit c83c3bc3a9
8 changed files with 273 additions and 9 deletions
+18 -4
View File
@@ -157,7 +157,12 @@ const defaultPublicDeprecatedExportsByEntrypointBudget = Object.freeze({
"channel-lifecycle": 23,
// +1: shared ingress error factory projected through the deprecated message barrel.
// +1: shared ingress retention defaults projected through the deprecated message barrel.
"channel-message": 131,
// +1: WhatsApp ack-policy bridge counted via channel-message's wildcard re-export.
"channel-message": 132,
// +2: Slack progress-draft render bridge (function + mode type).
"channel-outbound": 2,
// +2: WhatsApp ack-policy bridge (function + mode type).
"channel-feedback": 2,
"channel-pairing": 0,
"channel-policy": 7,
"channel-send-result": 1,
@@ -276,7 +281,10 @@ export function readPluginSdkSurfaceBudgets(env: NodeJS.ProcessEnv = process.env
// +11: Computer Use schemas/types plus parsers, compiler, and provider registration.
// +6: Computer Use v2 action, result, and capability contracts.
// +1: opaque channel participant evidence preservation without mint authority.
4324,
// +6: load-only bridges for published pre-split plugin artifacts
// (voice-call/matrix runtime-doctor repair names, WhatsApp ack policy,
// Slack progress-draft render) so installed plugins survive upgrade (#124041 class).
4330,
env,
),
publicFunctionExports: readPluginSdkSurfaceBudgetEnv(
@@ -346,7 +354,10 @@ export function readPluginSdkSurfaceBudgets(env: NodeJS.ProcessEnv = process.env
// -2: retire the dead progress-draft render reader; it counted twice via
// channel-outbound and channel-message's wildcard re-export of it.
// +4: Computer Use wire parsers, validator compiler, and provider registration.
2574,
// +3: load-only bridges for published pre-split plugin artifacts
// (voice-call/matrix runtime-doctor repair names, WhatsApp ack policy,
// Slack progress-draft render) so installed plugins survive upgrade (#124041 class).
2577,
env,
),
publicDeprecatedExports: readPluginSdkSurfaceBudgetEnv(
@@ -362,7 +373,10 @@ export function readPluginSdkSurfaceBudgets(env: NodeJS.ProcessEnv = process.env
// +7: restore still-existing deprecated inbound-dispatch compatibility re-exports.
// +6: source-compatible harness contracts retained during the V2 migration window.
// +4: shipped default-agent resolver projections retained during explicit-owner migration.
1146,
// +5: load-only bridges for published pre-split plugin artifacts
// (voice-call/matrix runtime-doctor repair names, WhatsApp ack policy,
// Slack progress-draft render) so installed plugins survive upgrade (#124041 class).
1151,
env,
),
publicWildcardReexports: readPluginSdkSurfaceBudgetEnv(