Plugins

Penyiapan dan konfigurasi Plugin

Referensi untuk pengemasan Plugin (metadata package.json), manifes (openclaw.plugin.json), entri penyiapan, dan skema konfigurasi.

Metadata paket

package.json Anda memerlukan kolom openclaw yang memberi tahu sistem Plugin apa yang disediakan Plugin Anda:

Plugin channel

{
  "name": "@myorg/openclaw-my-channel",
  "version": "1.0.0",
  "type": "module",
  "openclaw": {
    "extensions": ["./index.ts"],
    "setupEntry": "./setup-entry.ts",
    "channel": {
      "id": "my-channel",
      "label": "My Channel",
      "blurb": "Short description of the channel."
    }
  }
}

Plugin provider / baseline ClawHub

{
  "name": "@myorg/openclaw-my-plugin",
  "version": "1.0.0",
  "type": "module",
  "openclaw": {
    "extensions": ["./index.ts"],
    "compat": {
      "pluginApi": ">=2026.3.24-beta.2",
      "minGatewayVersion": "2026.3.24-beta.2"
    },
    "build": {
      "openclawVersion": "2026.3.24-beta.2",
      "pluginSdkVersion": "2026.3.24-beta.2"
    }
  }
}

Kolom openclaw

extensionsstring[]

Berkas titik masuk (relatif terhadap root paket).

setupEntrystring

Entri ringan khusus penyiapan (opsional).

channelobject

Metadata katalog channel untuk permukaan penyiapan, pemilih, quickstart, dan status.

providersstring[]

ID provider yang didaftarkan oleh Plugin ini.

installobject

Petunjuk instalasi: npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery.

startupobject

Flag perilaku startup.

openclaw.channel

openclaw.channel adalah metadata paket ringan untuk penemuan channel dan permukaan penyiapan sebelum runtime dimuat.

Kolom Tipe Artinya
id string ID channel kanonis.
label string Label channel utama.
selectionLabel string Label pemilih/penyiapan ketika perlu berbeda dari label.
detailLabel string Label detail sekunder untuk katalog channel dan permukaan status yang lebih kaya.
docsPath string Jalur docs untuk tautan penyiapan dan pemilihan.
docsLabel string Label pengganti yang digunakan untuk tautan docs ketika perlu berbeda dari ID channel.
blurb string Deskripsi singkat untuk onboarding/katalog.
order number Urutan sortir dalam katalog channel.
aliases string[] Alias pencarian tambahan untuk pemilihan channel.
preferOver string[] ID Plugin/channel berprioritas lebih rendah yang harus dikalahkan channel ini.
systemImage string Nama ikon/system-image opsional untuk katalog UI channel.
selectionDocsPrefix string Teks awalan sebelum tautan docs di permukaan pemilihan.
selectionDocsOmitLabel boolean Tampilkan jalur docs secara langsung, bukan tautan docs berlabel dalam salinan pemilihan.
selectionExtras string[] String pendek tambahan yang ditambahkan dalam salinan pemilihan.
markdownCapable boolean Menandai channel sebagai mampu Markdown untuk keputusan pemformatan keluar.
exposure object Kontrol visibilitas channel untuk permukaan penyiapan, daftar terkonfigurasi, dan docs.
quickstartAllowFrom boolean Mengikutkan channel ini ke alur penyiapan allowFrom quickstart standar.
forceAccountBinding boolean Mewajibkan pengikatan akun eksplisit bahkan ketika hanya ada satu akun.
preferSessionLookupForAnnounceTarget boolean Utamakan pencarian sesi saat menyelesaikan target pengumuman untuk channel ini.

Contoh:

{
  "openclaw": {
    "channel": {
      "id": "my-channel",
      "label": "My Channel",
      "selectionLabel": "My Channel (self-hosted)",
      "detailLabel": "My Channel Bot",
      "docsPath": "/channels/my-channel",
      "docsLabel": "my-channel",
      "blurb": "Webhook-based self-hosted chat integration.",
      "order": 80,
      "aliases": ["mc"],
      "preferOver": ["my-channel-legacy"],
      "selectionDocsPrefix": "Guide:",
      "selectionExtras": ["Markdown"],
      "markdownCapable": true,
      "exposure": {
        "configured": true,
        "setup": true,
        "docs": true
      },
      "quickstartAllowFrom": true
    }
  }
}

exposure mendukung:

  • configured: menyertakan channel dalam permukaan daftar bergaya terkonfigurasi/status
  • setup: menyertakan channel dalam pemilih penyiapan/konfigurasi interaktif
  • docs: menandai channel sebagai tampil untuk publik di permukaan docs/navigasi

openclaw.install

openclaw.install adalah metadata paket, bukan metadata manifes.

Kolom Tipe Artinya
clawhubSpec string Spesifikasi ClawHub kanonis untuk instalasi/pembaruan dan alur onboarding install-on-demand.
npmSpec string Spesifikasi npm kanonis untuk alur fallback instalasi/pembaruan.
localPath string Jalur pengembangan lokal atau instalasi bawaan.
defaultChoice "clawhub" | "npm" | "local" Sumber instalasi pilihan ketika beberapa sumber tersedia.
minHostVersion string Versi OpenClaw minimum yang didukung dalam bentuk >=x.y.z atau >=x.y.z-prerelease.
expectedIntegrity string String integritas dist npm yang diharapkan, biasanya sha512-..., untuk instalasi terpaku.
allowInvalidConfigRecovery boolean Memungkinkan alur instal ulang Plugin bawaan pulih dari kegagalan konfigurasi basi tertentu.
Perilaku onboarding

Onboarding interaktif juga menggunakan openclaw.install untuk permukaan install-on-demand. Jika Plugin Anda mengekspos pilihan auth provider atau metadata penyiapan/katalog channel sebelum runtime dimuat, onboarding dapat menampilkan pilihan tersebut, meminta instalasi ClawHub, npm, atau lokal, menginstal atau mengaktifkan Plugin, lalu melanjutkan alur yang dipilih. Pilihan onboarding ClawHub menggunakan clawhubSpec dan diutamakan saat ada; pilihan npm memerlukan metadata katalog tepercaya dengan npmSpec registry; versi persis dan expectedIntegrity adalah pin npm opsional. Jika expectedIntegrity ada, alur instalasi/pembaruan akan menerapkannya untuk npm. Simpan metadata "apa yang ditampilkan" di openclaw.plugin.json dan metadata "cara menginstalnya" di package.json.

Penerapan minHostVersion

Jika minHostVersion ditetapkan, instalasi dan pemuatan registry manifes non-bawaan sama-sama menerapkannya. Host lama melewati Plugin eksternal; string versi yang tidak valid ditolak. Plugin sumber bawaan diasumsikan seversi dengan checkout host.

Instalasi npm terpaku

Untuk instalasi npm terpaku, simpan versi persis di npmSpec dan tambahkan integritas artefak yang diharapkan:

{
  "openclaw": {
    "install": {
      "npmSpec": "@wecom/[email protected]",
      "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY",
      "defaultChoice": "npm"
    }
  }
}
Cakupan allowInvalidConfigRecovery

allowInvalidConfigRecovery bukan bypass umum untuk konfigurasi rusak. Ini hanya untuk pemulihan sempit Plugin bawaan, sehingga instal ulang/penyiapan dapat memperbaiki sisa peningkatan versi yang diketahui seperti jalur Plugin bawaan yang hilang atau entri channels.<id> basi untuk Plugin yang sama. Jika konfigurasi rusak karena alasan yang tidak terkait, instalasi tetap gagal tertutup dan memberi tahu operator untuk menjalankan openclaw doctor --fix.

Pemuatan penuh tertunda

Plugin channel dapat ikut serta dalam pemuatan tertunda dengan:

{
  "openclaw": {
    "extensions": ["./index.ts"],
    "setupEntry": "./setup-entry.ts",
    "startup": {
      "deferConfiguredChannelFullLoadUntilAfterListen": true
    }
  }
}

Saat diaktifkan, OpenClaw hanya memuat setupEntry selama fase startup sebelum listen, bahkan untuk channel yang sudah dikonfigurasi. Entri penuh dimuat setelah Gateway mulai listen.

Jika entri penyiapan/penuh Anda mendaftarkan metode RPC Gateway, pertahankan pada prefiks khusus Plugin. Namespace admin inti yang dicadangkan (config.*, exec.approvals.*, wizard.*, update.*) tetap dimiliki inti dan selalu diselesaikan ke operator.admin.

Manifes Plugin

Setiap Plugin native harus menyertakan openclaw.plugin.json di root paket. OpenClaw menggunakannya untuk memvalidasi konfigurasi tanpa mengeksekusi kode Plugin.

{
  "id": "my-plugin",
  "name": "My Plugin",
  "description": "Adds My Plugin capabilities to OpenClaw",
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "webhookSecret": {
        "type": "string",
        "description": "Webhook verification secret"
      }
    }
  }
}

Untuk Plugin channel, tambahkan kind dan channels:

{
  "id": "my-channel",
  "kind": "channel",
  "channels": ["my-channel"],
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {}
  }
}

Bahkan Plugin tanpa konfigurasi harus menyertakan skema. Skema kosong valid:

{
  "id": "my-plugin",
  "configSchema": {
    "type": "object",
    "additionalProperties": false
  }
}

Lihat Manifes Plugin untuk referensi skema lengkap.

Penerbitan ClawHub

Untuk paket Plugin, gunakan perintah ClawHub khusus paket:

clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin

Entri setup

File setup-entry.ts adalah alternatif ringan untuk index.ts yang dimuat OpenClaw saat hanya membutuhkan permukaan setup (onboarding, perbaikan config, inspeksi channel yang dinonaktifkan).

// setup-entry.ts


export default defineSetupPluginEntry(myChannelPlugin);

Ini menghindari pemuatan kode runtime yang berat (pustaka kripto, registrasi CLI, layanan latar belakang) selama alur setup.

Channel workspace bawaan yang menyimpan ekspor aman-setup dalam modul sidecar dapat menggunakan defineBundledChannelSetupEntry(...) dari openclaw/plugin-sdk/channel-entry-contract, bukan defineSetupPluginEntry(...). Kontrak bawaan itu juga mendukung ekspor runtime opsional agar wiring runtime saat setup tetap ringan dan eksplisit.

When OpenClaw uses setupEntry instead of the full entry
  • Channel dinonaktifkan tetapi membutuhkan permukaan setup/onboarding.
  • Channel diaktifkan tetapi belum dikonfigurasi.
  • Pemuatan tertunda diaktifkan (deferConfiguredChannelFullLoadUntilAfterListen).
What setupEntry must register
  • Objek Plugin channel (melalui defineSetupPluginEntry).
  • Route HTTP apa pun yang diperlukan sebelum gateway listen.
  • Metode Gateway apa pun yang diperlukan selama startup.

Metode Gateway startup tersebut tetap harus menghindari namespace admin core yang dicadangkan seperti config.* atau update.*.

What setupEntry should NOT include
  • Registrasi CLI.
  • Layanan latar belakang.
  • Import runtime berat (kripto, SDK).
  • Metode Gateway yang hanya diperlukan setelah startup.

Import helper setup sempit

Untuk path panas yang hanya setup, pilih seam helper setup yang sempit daripada payung plugin-sdk/setup yang lebih luas saat Anda hanya membutuhkan sebagian permukaan setup:

Path import Gunakan untuk Ekspor kunci
plugin-sdk/setup-runtime helper runtime saat setup yang tetap tersedia di setupEntry / startup channel tertunda createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy
plugin-sdk/setup-adapter-runtime adapter setup akun yang sadar lingkungan createEnvPatchedAccountSetupAdapter
plugin-sdk/setup-tools helper setup/install CLI/arsip/dokumen formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR

Gunakan seam plugin-sdk/setup yang lebih luas saat Anda menginginkan toolbox setup bersama lengkap, termasuk helper patch config seperti moveSingleAccountChannelSectionToDefaultAccount(...).

Adapter patch setup tetap aman untuk path panas saat diimpor. Lookup permukaan kontrak promosi akun tunggal bawaan bersifat lazy, sehingga mengimpor plugin-sdk/setup-runtime tidak memuat discovery permukaan kontrak bawaan secara eager sebelum adapter benar-benar digunakan.

Promosi akun tunggal milik channel

Saat channel meningkatkan config tingkat atas akun tunggal ke channels.<id>.accounts.*, perilaku bersama default adalah memindahkan nilai tercakup akun yang dipromosikan ke accounts.default.

Channel bawaan dapat mempersempit atau menimpa promosi itu melalui permukaan kontrak setupnya:

  • singleAccountKeysToMove: kunci tingkat atas tambahan yang harus dipindahkan ke akun yang dipromosikan
  • namedAccountPromotionKeys: saat akun bernama sudah ada, hanya kunci ini yang dipindahkan ke akun yang dipromosikan; kunci kebijakan/pengiriman bersama tetap berada di root channel
  • resolveSingleAccountPromotionTarget(...): pilih akun yang sudah ada yang menerima nilai yang dipromosikan

Skema config

Config Plugin divalidasi terhadap JSON Schema dalam manifest Anda. Pengguna mengonfigurasi Plugin melalui:

{
  plugins: {
    entries: {
      "my-plugin": {
        config: {
          webhookSecret: "abc123",
        },
      },
    },
  },
}

Plugin Anda menerima config ini sebagai api.pluginConfig selama registrasi.

Untuk config khusus channel, gunakan bagian config channel sebagai gantinya:

{
  channels: {
    "my-channel": {
      token: "bot-token",
      allowFrom: ["user1", "user2"],
    },
  },
}

Membuat skema config channel

Gunakan buildChannelConfigSchema untuk mengonversi skema Zod menjadi wrapper ChannelConfigSchema yang digunakan oleh artefak config milik Plugin:



const accountSchema = z.object({
  token: z.string().optional(),
  allowFrom: z.array(z.string()).optional(),
  accounts: z.object({}).catchall(z.any()).optional(),
  defaultAccount: z.string().optional(),
});

const configSchema = buildChannelConfigSchema(accountSchema);

Jika Anda sudah menulis kontrak sebagai JSON Schema atau TypeBox, gunakan helper langsung agar OpenClaw dapat melewati konversi Zod-ke-JSON-Schema pada path metadata:



const configSchema = buildJsonChannelConfigSchema(
  Type.Object({
    token: Type.Optional(Type.String()),
    allowFrom: Type.Optional(Type.Array(Type.String())),
  }),
);

Untuk Plugin pihak ketiga, kontrak cold-path tetap merupakan manifest Plugin: cerminkan JSON Schema yang dihasilkan ke openclaw.plugin.json#channelConfigs agar skema config, setup, dan permukaan UI dapat menginspeksi channels.<id> tanpa memuat kode runtime.

Wizard setup

Plugin channel dapat menyediakan wizard setup interaktif untuk openclaw onboard. Wizard adalah objek ChannelSetupWizard pada ChannelPlugin:


const setupWizard: ChannelSetupWizard = {
  channel: "my-channel",
  status: {
    configuredLabel: "Connected",
    unconfiguredLabel: "Not configured",
    resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token),
  },
  credentials: [
    {
      inputKey: "token",
      providerHint: "my-channel",
      credentialLabel: "Bot token",
      preferredEnvVar: "MY_CHANNEL_BOT_TOKEN",
      envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?",
      keepPrompt: "Keep current token?",
      inputPrompt: "Enter your bot token:",
      inspect: ({ cfg, accountId }) => {
        const token = (cfg.channels as any)?.["my-channel"]?.token;
        return {
          accountConfigured: Boolean(token),
          hasConfiguredValue: Boolean(token),
        };
      },
    },
  ],
};

Tipe ChannelSetupWizard mendukung credentials, textInputs, dmPolicy, allowFrom, groupAccess, prepare, finalize, dan lainnya. Lihat paket Plugin bawaan (misalnya Plugin Discord src/channel.setup.ts) untuk contoh lengkap.

Shared allowFrom prompts

Untuk prompt allowlist DM yang hanya membutuhkan alur standar note -> prompt -> parse -> merge -> patch, pilih helper setup bersama dari openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...), createTopLevelChannelParsedAllowFromPrompt(...), dan createNestedChannelParsedAllowFromPrompt(...).

Standard channel setup status

Untuk blok status setup channel yang hanya berbeda menurut label, skor, dan baris tambahan opsional, pilih createStandardChannelSetupStatus(...) dari openclaw/plugin-sdk/setup alih-alih membuat objek status yang sama secara manual di setiap Plugin.

Optional channel setup surface

Untuk permukaan setup opsional yang hanya boleh muncul dalam konteks tertentu, gunakan createOptionalChannelSetupSurface dari openclaw/plugin-sdk/channel-setup:

import { createOptionalChannelSetupSurface } from "openclaw/plugin-sdk/channel-setup";

const setupSurface = createOptionalChannelSetupSurface({
  channel: "my-channel",
  label: "My Channel",
  npmSpec: "@myorg/openclaw-my-channel",
  docsPath: "/channels/my-channel",
});
// Returns { setupAdapter, setupWizard }

plugin-sdk/channel-setup juga mengekspos builder tingkat lebih rendah createOptionalChannelSetupAdapter(...) dan createOptionalChannelSetupWizard(...) saat Anda hanya membutuhkan salah satu bagian dari permukaan install opsional itu.

Adapter/wizard opsional yang dihasilkan fail closed pada penulisan config nyata. Keduanya menggunakan kembali satu pesan perlu-install di validateInput, applyAccountConfig, dan finalize, serta menambahkan tautan dokumen saat docsPath ditetapkan.

Binary-backed setup helpers

Untuk UI setup berbasis binary, pilih helper delegasi bersama alih-alih menyalin glue binary/status yang sama ke setiap channel:

  • createDetectedBinaryStatus(...) untuk blok status yang hanya berbeda menurut label, petunjuk, skor, dan deteksi binary
  • createCliPathTextInput(...) untuk input teks berbasis path
  • createDelegatedSetupWizardStatusResolvers(...), createDelegatedPrepare(...), createDelegatedFinalize(...), dan createDelegatedResolveConfigured(...) saat setupEntry perlu meneruskan ke wizard lengkap yang lebih berat secara lazy
  • createDelegatedTextInputShouldPrompt(...) saat setupEntry hanya perlu mendelegasikan keputusan textInputs[*].shouldPrompt

Menerbitkan dan menginstal

Plugin eksternal: terbitkan ke ClawHub, lalu instal:

npm

openclaw plugins install @myorg/openclaw-my-plugin

Spec paket tanpa awalan diinstal dari npm selama cutover peluncuran.

ClawHub only

openclaw plugins install clawhub:@myorg/openclaw-my-plugin

npm package spec

Gunakan npm saat paket belum dipindahkan ke ClawHub, atau saat Anda membutuhkan path install npm langsung selama migrasi:

openclaw plugins install npm:@myorg/openclaw-my-plugin

Plugin dalam repo: tempatkan di bawah pohon workspace Plugin bawaan dan Plugin tersebut akan ditemukan secara otomatis selama build.

Pengguna dapat menginstal:

openclaw plugins install <package-name>

Metadata paket bawaan bersifat eksplisit, bukan disimpulkan dari JavaScript hasil build saat startup Gateway. Dependensi runtime berada di paket Plugin yang memilikinya; startup OpenClaw terpaket tidak pernah memperbaiki atau mencerminkan dependensi Plugin.

Terkait