跳到正文
FunCoding

搜索

搜索文档、文章、Skill 和 MCP

Plugin SDK defineSetupPluginEntry helper

The lightweight setup entry helper and the narrow setup helper families

The entry helper for the lightweight setup-entry.ts file, and the narrow setup helper families that pair with it. Part of the Plugin entry points reference.

defineSetupPluginEntry

Import: openclaw/plugin-sdk/channel-core

For the lightweight setup-entry.ts file. Returns just { plugin } with no runtime or CLI wiring.

import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";

export default defineSetupPluginEntry(myChannelPlugin);

OpenClaw loads this instead of the full entry when a channel is disabled or unconfigured. See Setup and Config for when this matters.

Doctor also inspects this public setup entry when finishing a deferred plugin upgrade. It uses plugin.lifecycle.detectLegacyStateMigrations when provided. Keep the detector on this lightweight entry while a released version may still need a legacy migration; omitting it does not prove that the full entry has no migration, so Doctor keeps the upgrade obligation pending. Missing or broken setup entries also keep the obligation pending.

Pair defineSetupPluginEntry(...) with the narrow setup helper families:

ImportUse for
openclaw/plugin-sdk/setup-runtimeRuntime-safe setup helpers: createSetupTranslator, import-safe setup patch adapters, lookup-note output, promptResolvedAllowFrom, splitSetupEntries, delegated setup proxies
openclaw/plugin-sdk/channel-setupOptional-install setup surfaces
openclaw/plugin-sdk/channel-dm-policyAccount-aware DM policy descriptors for setup flows
openclaw/plugin-sdk/setup-toolsSetup/install CLI, archive, and docs helpers
openclaw/plugin-sdk/archiveBounded TAR/gzip member inspection, archive extraction, and single-entry reads
openclaw/plugin-sdk/root-walkBudgeted, root-bounded directory walking
openclaw/plugin-sdk/secret-filePinned secret reads and first-writer-wins creation

inspectTarArchive({ archivePath, timeoutMs, limits, entryFilter, onFiltered }) returns a bounded, frozen list of accepted { path, kind, size } TAR/gzip members without creating an extracted tree. It uses fs-safe's complete admission and zero-strip extraction policy, not tar display output. Paths use the existing canonical archive identity; LF and Unicode spelling are preserved. Use matching filter/limit settings and retain or verify the same archive bytes for subsequent extraction: inspection results are not reusable write authority. Only the resolved result is complete-admission evidence; a filter callback can precede a later policy failure. The member manifest does not synthesize implicit parent directories, so whole-tree consumers must authorize those parent paths separately.

Keep heavy SDKs, CLI registration, and long-lived runtime services in the full entry.

Bundled workspace channels that split setup and runtime surfaces can use defineBundledChannelSetupEntry(...) from openclaw/plugin-sdk/channel-entry-contract instead. It lets the setup entry keep setup-safe plugin/secrets exports while still exposing a runtime setter:

import { defineBundledChannelSetupEntry } from "openclaw/plugin-sdk/channel-entry-contract";

export default defineBundledChannelSetupEntry({
  importMetaUrl: import.meta.url,
  plugin: {
    specifier: "./channel-plugin-api.js",
    exportName: "myChannelPlugin",
  },
  runtime: {
    specifier: "./runtime-api.js",
    exportName: "setMyChannelRuntime",
  },
  registerSetupRuntime(api) {
    api.registerHttpRoute({
      path: "/my-channel/events",
      auth: "plugin",
      handler: async (req, res) => {
        /* setup-safe route */
      },
    });
  },
});

Use this only when a setup flow truly needs a lightweight runtime setter or setup-safe gateway surface for an unconfigured channel. registerSetupRuntime runs only for "setup-runtime" loads; keep it limited to config-only routes or methods required by that setup flow.