# Plugin Entry Point ## Format ```typescript import type { OpenClawPluginApi } from "openclaw/plugin-sdk"; const _G = globalThis as Record; const LIFECYCLE_KEY = "_myPluginGatewayLifecycleRegistered"; export default { id: "my-plugin", name: "My Plugin", register(api: OpenClawPluginApi) { const config = normalizeConfig(api); // Gateway lifecycle: only once if (!_G[LIFECYCLE_KEY]) { _G[LIFECYCLE_KEY] = true; // Start sidecars, init global resources api.on("gateway_stop", () => { _G[LIFECYCLE_KEY] = false; }); } // Agent session hooks: every register() call (dedup inside handler) registerMyHook(api, config); // Tools registerMyTools(api, config); api.logger.info("my-plugin: registered"); }, }; ``` ## Why globalThis? OpenClaw may hot-reload plugins. Module-level variables reset on reload, but `globalThis` persists. All mutable state must be on `globalThis`: - Startup flags → prevent double initialization - Dedup sets → prevent double hook execution - Runtime references → keep connections alive across reloads - Shared registries → preserve cross-plugin state ## Naming Convention ``` _PluginXxx # Internal state (e.g., _prismFacetRouters) __ # Cross-plugin public API (e.g., __yonexusClient) ```