// Auto-generated by scripts/generate-bundled-plugin-metadata.mjs. Do not edit directly.

export const GENERATED_BUNDLED_PLUGIN_METADATA = [
  {
    dirName: "acpx",
    idHint: "acpx",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/acpx",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw ACP runtime backend via acpx",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "acpx",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          command: {
            type: "string",
          },
          expectedVersion: {
            type: "string",
          },
          cwd: {
            type: "string",
          },
          permissionMode: {
            type: "string",
            enum: ["approve-all", "approve-reads", "deny-all"],
          },
          nonInteractivePermissions: {
            type: "string",
            enum: ["deny", "fail"],
          },
          strictWindowsCmdWrapper: {
            type: "boolean",
          },
          timeoutSeconds: {
            type: "number",
            minimum: 0.001,
          },
          queueOwnerTtlSeconds: {
            type: "number",
            minimum: 0,
          },
          mcpServers: {
            type: "object",
            additionalProperties: {
              type: "object",
              properties: {
                command: {
                  type: "string",
                  description: "Command to run the MCP server",
                },
                args: {
                  type: "array",
                  items: {
                    type: "string",
                  },
                  description: "Arguments to pass to the command",
                },
                env: {
                  type: "object",
                  additionalProperties: {
                    type: "string",
                  },
                  description: "Environment variables for the MCP server",
                },
              },
              required: ["command"],
            },
          },
        },
      },
      skills: ["./skills"],
      name: "ACPX Runtime",
      description:
        "ACP runtime backend powered by acpx with configurable command path and version policy.",
      uiHints: {
        command: {
          label: "acpx Command",
          help: "Optional path/command override for acpx (for example /home/user/repos/acpx/dist/cli.js). Leave unset to use plugin-local bundled acpx.",
        },
        expectedVersion: {
          label: "Expected acpx Version",
          help: 'Exact version to enforce or "any" to skip strict version matching.',
        },
        cwd: {
          label: "Default Working Directory",
          help: "Default cwd for ACP session operations when not set per session.",
        },
        permissionMode: {
          label: "Permission Mode",
          help: "Default acpx permission policy for runtime prompts.",
        },
        nonInteractivePermissions: {
          label: "Non-Interactive Permission Policy",
          help: "acpx policy when interactive permission prompts are unavailable.",
        },
        strictWindowsCmdWrapper: {
          label: "Strict Windows cmd Wrapper",
          help: "Enabled by default. On Windows, reject unresolved .cmd/.bat wrappers instead of shell fallback. Disable only for compatibility with non-standard wrappers.",
          advanced: true,
        },
        timeoutSeconds: {
          label: "Prompt Timeout Seconds",
          help: "Optional acpx timeout for each runtime turn.",
          advanced: true,
        },
        queueOwnerTtlSeconds: {
          label: "Queue Owner TTL Seconds",
          help: "Idle queue-owner TTL for acpx prompt turns. Keep this short in OpenClaw to avoid delayed completion after each turn.",
          advanced: true,
        },
        mcpServers: {
          label: "MCP Servers",
          help: "Named MCP server definitions to inject into ACPX-backed session bootstrap. Each entry needs a command and can include args and env.",
          advanced: true,
        },
      },
    },
  },
  {
    dirName: "amazon-bedrock",
    idHint: "amazon-bedrock",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/amazon-bedrock-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Amazon Bedrock provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "amazon-bedrock",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["amazon-bedrock"],
    },
  },
  {
    dirName: "anthropic",
    idHint: "anthropic",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/anthropic-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Anthropic provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "anthropic",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["anthropic"],
      providerAuthEnvVars: {
        anthropic: ["ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "anthropic",
          method: "setup-token",
          choiceId: "token",
          choiceLabel: "Anthropic token (paste setup-token)",
          choiceHint: "Run `claude setup-token` elsewhere, then paste the token here",
          groupId: "anthropic",
          groupLabel: "Anthropic",
          groupHint: "setup-token + API key",
        },
        {
          provider: "anthropic",
          method: "api-key",
          choiceId: "apiKey",
          choiceLabel: "Anthropic API key",
          groupId: "anthropic",
          groupLabel: "Anthropic",
          groupHint: "setup-token + API key",
          optionKey: "anthropicApiKey",
          cliFlag: "--anthropic-api-key",
          cliOption: "--anthropic-api-key <key>",
          cliDescription: "Anthropic API key",
        },
      ],
    },
  },
  {
    dirName: "bluebubbles",
    idHint: "bluebubbles",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/bluebubbles",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw BlueBubbles channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "bluebubbles",
        label: "BlueBubbles",
        selectionLabel: "BlueBubbles (macOS app)",
        detailLabel: "BlueBubbles",
        docsPath: "/channels/bluebubbles",
        docsLabel: "bluebubbles",
        blurb: "iMessage via the BlueBubbles mac app + REST API.",
        aliases: ["bb"],
        preferOver: ["imessage"],
        systemImage: "bubble.left.and.text.bubble.right",
        order: 75,
      },
      install: {
        npmSpec: "@openclaw/bluebubbles",
        localPath: "extensions/bluebubbles",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "bluebubbles",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["bluebubbles"],
    },
  },
  {
    dirName: "brave",
    idHint: "brave-plugin",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/brave-plugin",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Brave plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "brave",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          webSearch: {
            type: "object",
            additionalProperties: false,
            properties: {
              apiKey: {
                type: ["string", "object"],
              },
              mode: {
                type: "string",
                enum: ["web", "llm-context"],
              },
            },
          },
        },
      },
      providerAuthEnvVars: {
        brave: ["BRAVE_API_KEY"],
      },
      uiHints: {
        "webSearch.apiKey": {
          label: "Brave Search API Key",
          help: "Brave Search API key (fallback: BRAVE_API_KEY env var).",
          sensitive: true,
          placeholder: "BSA...",
        },
        "webSearch.mode": {
          label: "Brave Search Mode",
          help: "Brave Search mode: web or llm-context.",
        },
      },
    },
  },
  {
    dirName: "byteplus",
    idHint: "byteplus",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/byteplus-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw BytePlus provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "byteplus",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["byteplus", "byteplus-plan"],
      providerAuthEnvVars: {
        byteplus: ["BYTEPLUS_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "byteplus",
          method: "api-key",
          choiceId: "byteplus-api-key",
          choiceLabel: "BytePlus API key",
          groupId: "byteplus",
          groupLabel: "BytePlus",
          groupHint: "API key",
          optionKey: "byteplusApiKey",
          cliFlag: "--byteplus-api-key",
          cliOption: "--byteplus-api-key <key>",
          cliDescription: "BytePlus API key",
        },
      ],
    },
  },
  {
    dirName: "chutes",
    idHint: "chutes",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/chutes-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Chutes.ai provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "chutes",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      enabledByDefault: true,
      providers: ["chutes"],
      providerAuthEnvVars: {
        chutes: ["CHUTES_API_KEY", "CHUTES_OAUTH_TOKEN"],
      },
      providerAuthChoices: [
        {
          provider: "chutes",
          method: "oauth",
          choiceId: "chutes",
          choiceLabel: "Chutes (OAuth)",
          choiceHint: "Browser sign-in",
          groupId: "chutes",
          groupLabel: "Chutes",
          groupHint: "OAuth + API key",
        },
        {
          provider: "chutes",
          method: "api-key",
          choiceId: "chutes-api-key",
          choiceLabel: "Chutes API key",
          choiceHint: "Open-source models including Llama, DeepSeek, and more",
          groupId: "chutes",
          groupLabel: "Chutes",
          groupHint: "OAuth + API key",
          optionKey: "chutesApiKey",
          cliFlag: "--chutes-api-key",
          cliOption: "--chutes-api-key <key>",
          cliDescription: "Chutes API key",
        },
      ],
    },
  },
  {
    dirName: "cloudflare-ai-gateway",
    idHint: "cloudflare-ai-gateway",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/cloudflare-ai-gateway-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Cloudflare AI Gateway provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "cloudflare-ai-gateway",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["cloudflare-ai-gateway"],
      providerAuthEnvVars: {
        "cloudflare-ai-gateway": ["CLOUDFLARE_AI_GATEWAY_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "cloudflare-ai-gateway",
          method: "api-key",
          choiceId: "cloudflare-ai-gateway-api-key",
          choiceLabel: "Cloudflare AI Gateway",
          choiceHint: "Account ID + Gateway ID + API key",
          groupId: "cloudflare-ai-gateway",
          groupLabel: "Cloudflare AI Gateway",
          groupHint: "Account ID + Gateway ID + API key",
          optionKey: "cloudflareAiGatewayApiKey",
          cliFlag: "--cloudflare-ai-gateway-api-key",
          cliOption: "--cloudflare-ai-gateway-api-key <key>",
          cliDescription: "Cloudflare AI Gateway API key",
        },
      ],
    },
  },
  {
    dirName: "copilot-proxy",
    idHint: "copilot-proxy",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/copilot-proxy",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Copilot Proxy provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "copilot-proxy",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["copilot-proxy"],
      providerAuthChoices: [
        {
          provider: "copilot-proxy",
          method: "local",
          choiceId: "copilot-proxy",
          choiceLabel: "Copilot Proxy",
          choiceHint: "Configure base URL + model ids",
          groupId: "copilot",
          groupLabel: "Copilot",
          groupHint: "GitHub + local proxy",
        },
      ],
    },
  },
  {
    dirName: "deepgram",
    idHint: "deepgram",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/deepgram-provider",
    packageVersion: "2026.3.14",
    packageDescription: "OpenClaw Deepgram media-understanding provider",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "deepgram",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
    },
  },
  {
    dirName: "diagnostics-otel",
    idHint: "diagnostics-otel",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/diagnostics-otel",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw diagnostics OpenTelemetry exporter",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "diagnostics-otel",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
    },
  },
  {
    dirName: "diffs",
    idHint: "diffs",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/diffs",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw diff viewer plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "diffs",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          defaults: {
            type: "object",
            additionalProperties: false,
            properties: {
              fontFamily: {
                type: "string",
                default: "Fira Code",
              },
              fontSize: {
                type: "number",
                minimum: 10,
                maximum: 24,
                default: 15,
              },
              lineSpacing: {
                type: "number",
                minimum: 1,
                maximum: 3,
                default: 1.6,
              },
              layout: {
                type: "string",
                enum: ["unified", "split"],
                default: "unified",
              },
              showLineNumbers: {
                type: "boolean",
                default: true,
              },
              diffIndicators: {
                type: "string",
                enum: ["bars", "classic", "none"],
                default: "bars",
              },
              wordWrap: {
                type: "boolean",
                default: true,
              },
              background: {
                type: "boolean",
                default: true,
              },
              theme: {
                type: "string",
                enum: ["light", "dark"],
                default: "dark",
              },
              fileFormat: {
                type: "string",
                enum: ["png", "pdf"],
                default: "png",
              },
              format: {
                type: "string",
                enum: ["png", "pdf"],
              },
              fileQuality: {
                type: "string",
                enum: ["standard", "hq", "print"],
                default: "standard",
              },
              fileScale: {
                type: "number",
                minimum: 1,
                maximum: 4,
                default: 2,
              },
              fileMaxWidth: {
                type: "number",
                minimum: 640,
                maximum: 2400,
                default: 960,
              },
              imageFormat: {
                type: "string",
                enum: ["png", "pdf"],
              },
              imageQuality: {
                type: "string",
                enum: ["standard", "hq", "print"],
              },
              imageScale: {
                type: "number",
                minimum: 1,
                maximum: 4,
              },
              imageMaxWidth: {
                type: "number",
                minimum: 640,
                maximum: 2400,
              },
              mode: {
                type: "string",
                enum: ["view", "image", "file", "both"],
                default: "both",
              },
            },
          },
          security: {
            type: "object",
            additionalProperties: false,
            properties: {
              allowRemoteViewer: {
                type: "boolean",
                default: false,
              },
            },
          },
        },
      },
      skills: ["./skills"],
      name: "Diffs",
      description: "Read-only diff viewer and file renderer for agents.",
      uiHints: {
        "defaults.fontFamily": {
          label: "Default Font",
          help: "Preferred font family name for diff content and headers.",
        },
        "defaults.fontSize": {
          label: "Default Font Size",
          help: "Base diff font size in pixels.",
        },
        "defaults.lineSpacing": {
          label: "Default Line Spacing",
          help: "Line-height multiplier applied to diff rows.",
        },
        "defaults.layout": {
          label: "Default Layout",
          help: "Initial diff layout shown in the viewer.",
        },
        "defaults.showLineNumbers": {
          label: "Show Line Numbers",
          help: "Show line numbers by default.",
        },
        "defaults.diffIndicators": {
          label: "Diff Indicator Style",
          help: "Choose added/removed indicators style.",
        },
        "defaults.wordWrap": {
          label: "Default Word Wrap",
          help: "Wrap long lines by default.",
        },
        "defaults.background": {
          label: "Default Background Highlights",
          help: "Show added/removed background highlights by default.",
        },
        "defaults.theme": {
          label: "Default Theme",
          help: "Initial viewer theme.",
        },
        "defaults.fileFormat": {
          label: "Default File Format",
          help: "Rendered file format for file mode (PNG or PDF).",
        },
        "defaults.fileQuality": {
          label: "Default File Quality",
          help: "Quality preset for PNG/PDF rendering.",
        },
        "defaults.fileScale": {
          label: "Default File Scale",
          help: "Device scale factor used while rendering file artifacts.",
        },
        "defaults.fileMaxWidth": {
          label: "Default File Max Width",
          help: "Maximum file render width in CSS pixels.",
        },
        "defaults.mode": {
          label: "Default Output Mode",
          help: "Tool default when mode is omitted. Use view for canvas/gateway viewer, file for PNG/PDF, or both.",
        },
        "security.allowRemoteViewer": {
          label: "Allow Remote Viewer",
          help: "Allow non-loopback access to diff viewer URLs when the token path is known.",
        },
      },
    },
  },
  {
    dirName: "discord",
    idHint: "discord",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/discord",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Discord channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "discord",
        label: "Discord",
        selectionLabel: "Discord (Bot API)",
        detailLabel: "Discord Bot",
        docsPath: "/channels/discord",
        docsLabel: "discord",
        blurb: "very well supported right now.",
        systemImage: "bubble.left.and.bubble.right",
      },
      install: {
        npmSpec: "@openclaw/discord",
        localPath: "extensions/discord",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "discord",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["discord"],
    },
  },
  {
    dirName: "duckduckgo",
    idHint: "duckduckgo-plugin",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/duckduckgo-plugin",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw DuckDuckGo plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "duckduckgo",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          webSearch: {
            type: "object",
            additionalProperties: false,
            properties: {
              region: {
                type: "string",
              },
              safeSearch: {
                type: "string",
                enum: ["strict", "moderate", "off"],
              },
            },
          },
        },
      },
      uiHints: {
        "webSearch.region": {
          label: "DuckDuckGo Region",
          help: "Optional DuckDuckGo region code such as us-en, uk-en, or de-de.",
        },
        "webSearch.safeSearch": {
          label: "DuckDuckGo SafeSearch",
          help: "SafeSearch level for DuckDuckGo results.",
        },
      },
    },
  },
  {
    dirName: "elevenlabs",
    idHint: "elevenlabs",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/elevenlabs-speech",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw ElevenLabs speech plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "elevenlabs",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
    },
  },
  {
    dirName: "exa",
    idHint: "exa-plugin",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/exa-plugin",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Exa plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "exa",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          webSearch: {
            type: "object",
            additionalProperties: false,
            properties: {
              apiKey: {
                type: ["string", "object"],
              },
            },
          },
        },
      },
      providerAuthEnvVars: {
        exa: ["EXA_API_KEY"],
      },
      uiHints: {
        "webSearch.apiKey": {
          label: "Exa API Key",
          help: "Exa Search API key (fallback: EXA_API_KEY env var).",
          sensitive: true,
          placeholder: "exa-...",
        },
      },
    },
  },
  {
    dirName: "fal",
    idHint: "fal",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/fal-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw fal provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "fal",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["fal"],
      providerAuthEnvVars: {
        fal: ["FAL_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "fal",
          method: "api-key",
          choiceId: "fal-api-key",
          choiceLabel: "fal API key",
          groupId: "fal",
          groupLabel: "fal",
          groupHint: "Image generation",
          onboardingScopes: ["image-generation"],
          optionKey: "falApiKey",
          cliFlag: "--fal-api-key",
          cliOption: "--fal-api-key <key>",
          cliDescription: "fal API key",
        },
      ],
    },
  },
  {
    dirName: "feishu",
    idHint: "feishu",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/feishu",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "feishu",
        label: "Feishu",
        selectionLabel: "Feishu/Lark (飞书)",
        docsPath: "/channels/feishu",
        docsLabel: "feishu",
        blurb: "飞书/Lark enterprise messaging with doc/wiki/drive tools.",
        aliases: ["lark"],
        order: 35,
        quickstartAllowFrom: true,
      },
      install: {
        npmSpec: "@openclaw/feishu",
        localPath: "extensions/feishu",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "feishu",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["feishu"],
      skills: ["./skills"],
    },
  },
  {
    dirName: "firecrawl",
    idHint: "firecrawl-plugin",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/firecrawl-plugin",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Firecrawl plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "firecrawl",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          webSearch: {
            type: "object",
            additionalProperties: false,
            properties: {
              apiKey: {
                type: ["string", "object"],
              },
              baseUrl: {
                type: "string",
              },
            },
          },
        },
      },
      providerAuthEnvVars: {
        firecrawl: ["FIRECRAWL_API_KEY"],
      },
      uiHints: {
        "webSearch.apiKey": {
          label: "Firecrawl Search API Key",
          help: "Firecrawl API key for web search (fallback: FIRECRAWL_API_KEY env var).",
          sensitive: true,
          placeholder: "fc-...",
        },
        "webSearch.baseUrl": {
          label: "Firecrawl Search Base URL",
          help: "Firecrawl Search base URL override.",
        },
      },
    },
  },
  {
    dirName: "github-copilot",
    idHint: "github-copilot",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/github-copilot-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw GitHub Copilot provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "github-copilot",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["github-copilot"],
      providerAuthEnvVars: {
        "github-copilot": ["COPILOT_GITHUB_TOKEN", "GH_TOKEN", "GITHUB_TOKEN"],
      },
      providerAuthChoices: [
        {
          provider: "github-copilot",
          method: "device",
          choiceId: "github-copilot",
          choiceLabel: "GitHub Copilot",
          choiceHint: "Device login with your GitHub account",
          groupId: "copilot",
          groupLabel: "Copilot",
          groupHint: "GitHub + local proxy",
        },
      ],
    },
  },
  {
    dirName: "google",
    idHint: "google-plugin",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/google-plugin",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Google plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "google",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          webSearch: {
            type: "object",
            additionalProperties: false,
            properties: {
              apiKey: {
                type: ["string", "object"],
              },
              model: {
                type: "string",
              },
            },
          },
        },
      },
      providers: ["google", "google-gemini-cli"],
      providerAuthEnvVars: {
        google: ["GEMINI_API_KEY", "GOOGLE_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "google",
          method: "api-key",
          choiceId: "gemini-api-key",
          choiceLabel: "Google Gemini API key",
          groupId: "google",
          groupLabel: "Google",
          groupHint: "Gemini API key + OAuth",
          optionKey: "geminiApiKey",
          cliFlag: "--gemini-api-key",
          cliOption: "--gemini-api-key <key>",
          cliDescription: "Gemini API key",
        },
        {
          provider: "google-gemini-cli",
          method: "oauth",
          choiceId: "google-gemini-cli",
          choiceLabel: "Gemini CLI OAuth",
          choiceHint: "Google OAuth with project-aware token payload",
          groupId: "google",
          groupLabel: "Google",
          groupHint: "Gemini API key + OAuth",
        },
      ],
      uiHints: {
        "webSearch.apiKey": {
          label: "Gemini Search API Key",
          help: "Gemini API key for Google Search grounding (fallback: GEMINI_API_KEY env var).",
          sensitive: true,
          placeholder: "AIza...",
        },
        "webSearch.model": {
          label: "Gemini Search Model",
          help: "Gemini model override for web search grounding.",
        },
      },
    },
  },
  {
    dirName: "googlechat",
    idHint: "googlechat",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/googlechat",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Google Chat channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "googlechat",
        label: "Google Chat",
        selectionLabel: "Google Chat (Chat API)",
        detailLabel: "Google Chat",
        docsPath: "/channels/googlechat",
        docsLabel: "googlechat",
        blurb: "Google Workspace Chat app via HTTP webhooks.",
        aliases: ["gchat", "google-chat"],
        order: 55,
      },
      install: {
        npmSpec: "@openclaw/googlechat",
        localPath: "extensions/googlechat",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "googlechat",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["googlechat"],
    },
  },
  {
    dirName: "groq",
    idHint: "groq",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/groq-provider",
    packageVersion: "2026.3.14",
    packageDescription: "OpenClaw Groq media-understanding provider",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "groq",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
    },
  },
  {
    dirName: "huggingface",
    idHint: "huggingface",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/huggingface-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Hugging Face provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "huggingface",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["huggingface"],
      providerAuthEnvVars: {
        huggingface: ["HUGGINGFACE_HUB_TOKEN", "HF_TOKEN"],
      },
      providerAuthChoices: [
        {
          provider: "huggingface",
          method: "api-key",
          choiceId: "huggingface-api-key",
          choiceLabel: "Hugging Face API key",
          choiceHint: "Inference API (HF token)",
          groupId: "huggingface",
          groupLabel: "Hugging Face",
          groupHint: "Inference API (HF token)",
          optionKey: "huggingfaceApiKey",
          cliFlag: "--huggingface-api-key",
          cliOption: "--huggingface-api-key <key>",
          cliDescription: "Hugging Face API key (HF token)",
        },
      ],
    },
  },
  {
    dirName: "imessage",
    idHint: "imessage",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/imessage",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw iMessage channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "imessage",
        label: "iMessage",
        selectionLabel: "iMessage (imsg)",
        detailLabel: "iMessage",
        docsPath: "/channels/imessage",
        docsLabel: "imessage",
        blurb: "this is still a work in progress.",
        aliases: ["imsg"],
        systemImage: "message.fill",
      },
    },
    manifest: {
      id: "imessage",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["imessage"],
    },
  },
  {
    dirName: "irc",
    idHint: "irc",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/irc",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw IRC channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "irc",
        label: "IRC",
        selectionLabel: "IRC (Server + Nick)",
        detailLabel: "IRC",
        docsPath: "/channels/irc",
        docsLabel: "irc",
        blurb: "classic IRC networks with DM/channel routing and pairing controls.",
        systemImage: "network",
      },
      install: {
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "irc",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["irc"],
    },
  },
  {
    dirName: "kilocode",
    idHint: "kilocode",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/kilocode-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Kilo Gateway provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "kilocode",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["kilocode"],
      providerAuthEnvVars: {
        kilocode: ["KILOCODE_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "kilocode",
          method: "api-key",
          choiceId: "kilocode-api-key",
          choiceLabel: "Kilo Gateway API key",
          choiceHint: "API key (OpenRouter-compatible)",
          groupId: "kilocode",
          groupLabel: "Kilo Gateway",
          groupHint: "API key (OpenRouter-compatible)",
          optionKey: "kilocodeApiKey",
          cliFlag: "--kilocode-api-key",
          cliOption: "--kilocode-api-key <key>",
          cliDescription: "Kilo Gateway API key",
        },
      ],
    },
  },
  {
    dirName: "kimi-coding",
    idHint: "kimi",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/kimi-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Kimi provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "kimi",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["kimi", "kimi-coding"],
      providerAuthEnvVars: {
        kimi: ["KIMI_API_KEY", "KIMICODE_API_KEY"],
        "kimi-coding": ["KIMI_API_KEY", "KIMICODE_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "kimi",
          method: "api-key",
          choiceId: "kimi-code-api-key",
          choiceLabel: "Kimi Code API key",
          groupId: "kimi-code",
          groupLabel: "Kimi Code",
          groupHint: "Dedicated coding endpoint",
          optionKey: "kimiCodeApiKey",
          cliFlag: "--kimi-code-api-key",
          cliOption: "--kimi-code-api-key <key>",
          cliDescription: "Kimi Code API key",
        },
      ],
    },
  },
  {
    dirName: "line",
    idHint: "line",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/line",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw LINE channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "line",
        label: "LINE",
        selectionLabel: "LINE (Messaging API)",
        docsPath: "/channels/line",
        docsLabel: "line",
        blurb: "LINE Messaging API bot for Japan/Taiwan/Thailand markets.",
        order: 75,
        quickstartAllowFrom: true,
      },
      install: {
        npmSpec: "@openclaw/line",
        localPath: "extensions/line",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "line",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["line"],
    },
  },
  {
    dirName: "llm-task",
    idHint: "llm-task",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/llm-task",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw JSON-only LLM task plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "llm-task",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          defaultProvider: {
            type: "string",
          },
          defaultModel: {
            type: "string",
          },
          defaultAuthProfileId: {
            type: "string",
          },
          allowedModels: {
            type: "array",
            items: {
              type: "string",
            },
            description: "Allowlist of provider/model keys like openai-codex/gpt-5.2.",
          },
          maxTokens: {
            type: "number",
          },
          timeoutMs: {
            type: "number",
          },
        },
      },
      name: "LLM Task",
      description: "Generic JSON-only LLM tool for structured tasks callable from workflows.",
    },
  },
  {
    dirName: "lobster",
    idHint: "lobster",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/lobster",
    packageVersion: "2026.3.22",
    packageDescription: "Lobster workflow tool plugin (typed pipelines + resumable approvals)",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "lobster",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      name: "Lobster",
      description: "Typed workflow tool with resumable approvals.",
    },
  },
  {
    dirName: "matrix",
    idHint: "matrix",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/matrix",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Matrix channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "matrix",
        label: "Matrix",
        selectionLabel: "Matrix (plugin)",
        docsPath: "/channels/matrix",
        docsLabel: "matrix",
        blurb: "open protocol; install the plugin to enable.",
        order: 70,
        quickstartAllowFrom: true,
      },
      install: {
        npmSpec: "@openclaw/matrix",
        localPath: "extensions/matrix",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "matrix",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["matrix"],
    },
  },
  {
    dirName: "mattermost",
    idHint: "mattermost",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/mattermost",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Mattermost channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "mattermost",
        label: "Mattermost",
        selectionLabel: "Mattermost (plugin)",
        docsPath: "/channels/mattermost",
        docsLabel: "mattermost",
        blurb: "self-hosted Slack-style chat; install the plugin to enable.",
        order: 65,
      },
      install: {
        npmSpec: "@openclaw/mattermost",
        localPath: "extensions/mattermost",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "mattermost",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["mattermost"],
    },
  },
  {
    dirName: "memory-core",
    idHint: "memory-core",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/memory-core",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw core memory search plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "memory-core",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      kind: "memory",
    },
  },
  {
    dirName: "memory-lancedb",
    idHint: "memory-lancedb",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/memory-lancedb",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw LanceDB-backed long-term memory plugin with auto-recall/capture",
    packageManifest: {
      extensions: ["./index.ts"],
      install: {
        npmSpec: "@openclaw/memory-lancedb",
        localPath: "extensions/memory-lancedb",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "memory-lancedb",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          embedding: {
            type: "object",
            additionalProperties: false,
            properties: {
              apiKey: {
                type: "string",
              },
              model: {
                type: "string",
              },
              baseUrl: {
                type: "string",
              },
              dimensions: {
                type: "number",
              },
            },
            required: ["apiKey"],
          },
          dbPath: {
            type: "string",
          },
          autoCapture: {
            type: "boolean",
          },
          autoRecall: {
            type: "boolean",
          },
          captureMaxChars: {
            type: "number",
            minimum: 100,
            maximum: 10000,
          },
        },
        required: ["embedding"],
      },
      kind: "memory",
      uiHints: {
        "embedding.apiKey": {
          label: "OpenAI API Key",
          sensitive: true,
          placeholder: "sk-proj-...",
          help: "API key for OpenAI embeddings (or use ${OPENAI_API_KEY})",
        },
        "embedding.model": {
          label: "Embedding Model",
          placeholder: "text-embedding-3-small",
          help: "OpenAI embedding model to use",
        },
        "embedding.baseUrl": {
          label: "Base URL",
          placeholder: "https://api.openai.com/v1",
          help: "Base URL for compatible providers (e.g. http://localhost:11434/v1)",
          advanced: true,
        },
        "embedding.dimensions": {
          label: "Dimensions",
          placeholder: "1536",
          help: "Vector dimensions for custom models (required for non-standard models)",
          advanced: true,
        },
        dbPath: {
          label: "Database Path",
          placeholder: "~/.openclaw/memory/lancedb",
          advanced: true,
        },
        autoCapture: {
          label: "Auto-Capture",
          help: "Automatically capture important information from conversations",
        },
        autoRecall: {
          label: "Auto-Recall",
          help: "Automatically inject relevant memories into context",
        },
        captureMaxChars: {
          label: "Capture Max Chars",
          help: "Maximum message length eligible for auto-capture",
          advanced: true,
          placeholder: "500",
        },
      },
    },
  },
  {
    dirName: "microsoft",
    idHint: "microsoft",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/microsoft-speech",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Microsoft speech plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "microsoft",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
    },
  },
  {
    dirName: "minimax",
    idHint: "minimax",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/minimax-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw MiniMax provider and OAuth plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "minimax",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["minimax", "minimax-portal"],
      providerAuthEnvVars: {
        minimax: ["MINIMAX_API_KEY"],
        "minimax-portal": ["MINIMAX_OAUTH_TOKEN", "MINIMAX_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "minimax-portal",
          method: "oauth",
          choiceId: "minimax-global-oauth",
          choiceLabel: "MiniMax OAuth (Global)",
          choiceHint: "Global endpoint - api.minimax.io",
          groupId: "minimax",
          groupLabel: "MiniMax",
          groupHint: "M2.7 (recommended)",
        },
        {
          provider: "minimax",
          method: "api-global",
          choiceId: "minimax-global-api",
          choiceLabel: "MiniMax API key (Global)",
          choiceHint: "Global endpoint - api.minimax.io",
          groupId: "minimax",
          groupLabel: "MiniMax",
          groupHint: "M2.7 (recommended)",
          optionKey: "minimaxApiKey",
          cliFlag: "--minimax-api-key",
          cliOption: "--minimax-api-key <key>",
          cliDescription: "MiniMax API key",
        },
        {
          provider: "minimax-portal",
          method: "oauth-cn",
          choiceId: "minimax-cn-oauth",
          choiceLabel: "MiniMax OAuth (CN)",
          choiceHint: "CN endpoint - api.minimaxi.com",
          groupId: "minimax",
          groupLabel: "MiniMax",
          groupHint: "M2.7 (recommended)",
        },
        {
          provider: "minimax",
          method: "api-cn",
          choiceId: "minimax-cn-api",
          choiceLabel: "MiniMax API key (CN)",
          choiceHint: "CN endpoint - api.minimaxi.com",
          groupId: "minimax",
          groupLabel: "MiniMax",
          groupHint: "M2.7 (recommended)",
          optionKey: "minimaxApiKey",
          cliFlag: "--minimax-api-key",
          cliOption: "--minimax-api-key <key>",
          cliDescription: "MiniMax API key",
        },
      ],
    },
  },
  {
    dirName: "mistral",
    idHint: "mistral",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/mistral-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Mistral provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "mistral",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["mistral"],
      providerAuthEnvVars: {
        mistral: ["MISTRAL_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "mistral",
          method: "api-key",
          choiceId: "mistral-api-key",
          choiceLabel: "Mistral API key",
          groupId: "mistral",
          groupLabel: "Mistral AI",
          groupHint: "API key",
          optionKey: "mistralApiKey",
          cliFlag: "--mistral-api-key",
          cliOption: "--mistral-api-key <key>",
          cliDescription: "Mistral API key",
        },
      ],
    },
  },
  {
    dirName: "modelstudio",
    idHint: "modelstudio",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/modelstudio-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Model Studio provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "modelstudio",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["modelstudio"],
      providerAuthEnvVars: {
        modelstudio: ["MODELSTUDIO_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "modelstudio",
          method: "api-key-cn",
          choiceId: "modelstudio-api-key-cn",
          choiceLabel: "Coding Plan API Key for China (subscription)",
          choiceHint: "Endpoint: coding.dashscope.aliyuncs.com",
          groupId: "modelstudio",
          groupLabel: "Alibaba Cloud Model Studio",
          groupHint: "Coding Plan API key (CN / Global)",
          optionKey: "modelstudioApiKeyCn",
          cliFlag: "--modelstudio-api-key-cn",
          cliOption: "--modelstudio-api-key-cn <key>",
          cliDescription: "Alibaba Cloud Model Studio Coding Plan API key (China)",
        },
        {
          provider: "modelstudio",
          method: "api-key",
          choiceId: "modelstudio-api-key",
          choiceLabel: "Coding Plan API Key for Global/Intl (subscription)",
          choiceHint: "Endpoint: coding-intl.dashscope.aliyuncs.com",
          groupId: "modelstudio",
          groupLabel: "Alibaba Cloud Model Studio",
          groupHint: "Coding Plan API key (CN / Global)",
          optionKey: "modelstudioApiKey",
          cliFlag: "--modelstudio-api-key",
          cliOption: "--modelstudio-api-key <key>",
          cliDescription: "Alibaba Cloud Model Studio Coding Plan API key (Global/Intl)",
        },
      ],
    },
  },
  {
    dirName: "moonshot",
    idHint: "moonshot",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/moonshot-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Moonshot provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "moonshot",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          webSearch: {
            type: "object",
            additionalProperties: false,
            properties: {
              apiKey: {
                type: ["string", "object"],
              },
              baseUrl: {
                type: "string",
              },
              model: {
                type: "string",
              },
            },
          },
        },
      },
      providers: ["moonshot"],
      providerAuthEnvVars: {
        moonshot: ["MOONSHOT_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "moonshot",
          method: "api-key",
          choiceId: "moonshot-api-key",
          choiceLabel: "Moonshot API key (.ai)",
          groupId: "moonshot",
          groupLabel: "Moonshot AI (Kimi K2.5)",
          groupHint: "Kimi K2.5",
          optionKey: "moonshotApiKey",
          cliFlag: "--moonshot-api-key",
          cliOption: "--moonshot-api-key <key>",
          cliDescription: "Moonshot API key",
        },
        {
          provider: "moonshot",
          method: "api-key-cn",
          choiceId: "moonshot-api-key-cn",
          choiceLabel: "Moonshot API key (.cn)",
          groupId: "moonshot",
          groupLabel: "Moonshot AI (Kimi K2.5)",
          groupHint: "Kimi K2.5",
          optionKey: "moonshotApiKey",
          cliFlag: "--moonshot-api-key",
          cliOption: "--moonshot-api-key <key>",
          cliDescription: "Moonshot API key",
        },
      ],
      uiHints: {
        "webSearch.apiKey": {
          label: "Kimi Search API Key",
          help: "Moonshot/Kimi API key (fallback: KIMI_API_KEY or MOONSHOT_API_KEY env var).",
          sensitive: true,
        },
        "webSearch.baseUrl": {
          label: "Kimi Search Base URL",
          help: "Kimi base URL override.",
        },
        "webSearch.model": {
          label: "Kimi Search Model",
          help: "Kimi model override.",
        },
      },
    },
  },
  {
    dirName: "msteams",
    idHint: "msteams",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/msteams",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Microsoft Teams channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "msteams",
        label: "Microsoft Teams",
        selectionLabel: "Microsoft Teams (Bot Framework)",
        docsPath: "/channels/msteams",
        docsLabel: "msteams",
        blurb: "Bot Framework; enterprise support.",
        aliases: ["teams"],
        order: 60,
      },
      install: {
        npmSpec: "@openclaw/msteams",
        localPath: "extensions/msteams",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "msteams",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["msteams"],
    },
  },
  {
    dirName: "nextcloud-talk",
    idHint: "nextcloud-talk",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/nextcloud-talk",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Nextcloud Talk channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "nextcloud-talk",
        label: "Nextcloud Talk",
        selectionLabel: "Nextcloud Talk (self-hosted)",
        docsPath: "/channels/nextcloud-talk",
        docsLabel: "nextcloud-talk",
        blurb: "Self-hosted chat via Nextcloud Talk webhook bots.",
        aliases: ["nc-talk", "nc"],
        order: 65,
        quickstartAllowFrom: true,
      },
      install: {
        npmSpec: "@openclaw/nextcloud-talk",
        localPath: "extensions/nextcloud-talk",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "nextcloud-talk",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["nextcloud-talk"],
    },
  },
  {
    dirName: "nostr",
    idHint: "nostr",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/nostr",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Nostr channel plugin for NIP-04 encrypted DMs",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "nostr",
        label: "Nostr",
        selectionLabel: "Nostr (NIP-04 DMs)",
        docsPath: "/channels/nostr",
        docsLabel: "nostr",
        blurb: "Decentralized protocol; encrypted DMs via NIP-04.",
        order: 55,
        quickstartAllowFrom: true,
      },
      install: {
        npmSpec: "@openclaw/nostr",
        localPath: "extensions/nostr",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "nostr",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["nostr"],
    },
  },
  {
    dirName: "nvidia",
    idHint: "nvidia",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/nvidia-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw NVIDIA provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "nvidia",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["nvidia"],
      providerAuthEnvVars: {
        nvidia: ["NVIDIA_API_KEY"],
      },
    },
  },
  {
    dirName: "ollama",
    idHint: "ollama",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/ollama-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Ollama provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "ollama",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["ollama"],
      providerAuthEnvVars: {
        ollama: ["OLLAMA_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "ollama",
          method: "local",
          choiceId: "ollama",
          choiceLabel: "Ollama",
          choiceHint: "Cloud and local open models",
          groupId: "ollama",
          groupLabel: "Ollama",
          groupHint: "Cloud and local open models",
        },
      ],
    },
  },
  {
    dirName: "open-prose",
    idHint: "open-prose",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/open-prose",
    packageVersion: "2026.3.22",
    packageDescription: "OpenProse VM skill pack plugin (slash command + telemetry).",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "open-prose",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      skills: ["./skills"],
      name: "OpenProse",
      description: "OpenProse VM skill pack with a /prose slash command.",
    },
  },
  {
    dirName: "openai",
    idHint: "openai",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/openai-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw OpenAI provider plugins",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "openai",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["openai", "openai-codex"],
      providerAuthEnvVars: {
        openai: ["OPENAI_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "openai-codex",
          method: "oauth",
          choiceId: "openai-codex",
          choiceLabel: "OpenAI Codex (ChatGPT OAuth)",
          choiceHint: "Browser sign-in",
          groupId: "openai",
          groupLabel: "OpenAI",
          groupHint: "Codex OAuth + API key",
        },
        {
          provider: "openai",
          method: "api-key",
          choiceId: "openai-api-key",
          choiceLabel: "OpenAI API key",
          groupId: "openai",
          groupLabel: "OpenAI",
          groupHint: "Codex OAuth + API key",
          optionKey: "openaiApiKey",
          cliFlag: "--openai-api-key",
          cliOption: "--openai-api-key <key>",
          cliDescription: "OpenAI API key",
        },
      ],
    },
  },
  {
    dirName: "opencode",
    idHint: "opencode",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/opencode-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw OpenCode Zen provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "opencode",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["opencode"],
      providerAuthEnvVars: {
        opencode: ["OPENCODE_API_KEY", "OPENCODE_ZEN_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "opencode",
          method: "api-key",
          choiceId: "opencode-zen",
          choiceLabel: "OpenCode Zen catalog",
          groupId: "opencode",
          groupLabel: "OpenCode",
          groupHint: "Shared API key for Zen + Go catalogs",
          optionKey: "opencodeZenApiKey",
          cliFlag: "--opencode-zen-api-key",
          cliOption: "--opencode-zen-api-key <key>",
          cliDescription: "OpenCode API key (Zen catalog)",
        },
      ],
    },
  },
  {
    dirName: "opencode-go",
    idHint: "opencode-go",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/opencode-go-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw OpenCode Go provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "opencode-go",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["opencode-go"],
      providerAuthEnvVars: {
        "opencode-go": ["OPENCODE_API_KEY", "OPENCODE_ZEN_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "opencode-go",
          method: "api-key",
          choiceId: "opencode-go",
          choiceLabel: "OpenCode Go catalog",
          groupId: "opencode",
          groupLabel: "OpenCode",
          groupHint: "Shared API key for Zen + Go catalogs",
          optionKey: "opencodeGoApiKey",
          cliFlag: "--opencode-go-api-key",
          cliOption: "--opencode-go-api-key <key>",
          cliDescription: "OpenCode API key (Go catalog)",
        },
      ],
    },
  },
  {
    dirName: "openrouter",
    idHint: "openrouter",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/openrouter-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw OpenRouter provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "openrouter",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["openrouter"],
      providerAuthEnvVars: {
        openrouter: ["OPENROUTER_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "openrouter",
          method: "api-key",
          choiceId: "openrouter-api-key",
          choiceLabel: "OpenRouter API key",
          groupId: "openrouter",
          groupLabel: "OpenRouter",
          groupHint: "API key",
          optionKey: "openrouterApiKey",
          cliFlag: "--openrouter-api-key",
          cliOption: "--openrouter-api-key <key>",
          cliDescription: "OpenRouter API key",
        },
      ],
    },
  },
  {
    dirName: "openshell",
    idHint: "openshell-sandbox",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/openshell-sandbox",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw OpenShell sandbox backend",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "openshell",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          command: {
            type: "string",
          },
          gateway: {
            type: "string",
          },
          gatewayEndpoint: {
            type: "string",
          },
          from: {
            type: "string",
          },
          policy: {
            type: "string",
          },
          providers: {
            type: "array",
            items: {
              type: "string",
            },
          },
          gpu: {
            type: "boolean",
          },
          autoProviders: {
            type: "boolean",
          },
          remoteWorkspaceDir: {
            type: "string",
          },
          remoteAgentWorkspaceDir: {
            type: "string",
          },
          timeoutSeconds: {
            type: "number",
            minimum: 1,
          },
        },
      },
      name: "OpenShell Sandbox",
      description:
        "Sandbox backend powered by OpenShell with mirrored local workspaces and SSH-based command execution.",
      uiHints: {
        command: {
          label: "OpenShell Command",
          help: "Path or command name for the openshell CLI.",
        },
        gateway: {
          label: "Gateway Name",
          help: "Optional OpenShell gateway name passed as --gateway.",
        },
        gatewayEndpoint: {
          label: "Gateway Endpoint",
          help: "Optional OpenShell gateway endpoint passed as --gateway-endpoint.",
        },
        from: {
          label: "Sandbox Source",
          help: "OpenShell sandbox source for first-time create. Defaults to openclaw.",
        },
        policy: {
          label: "Policy File",
          help: "Optional path to a custom OpenShell sandbox policy YAML.",
        },
        providers: {
          label: "Providers",
          help: "Provider names to attach when a sandbox is created.",
        },
        gpu: {
          label: "GPU",
          help: "Request GPU resources when creating the sandbox.",
          advanced: true,
        },
        autoProviders: {
          label: "Auto-create Providers",
          help: "When enabled, pass --auto-providers during sandbox create.",
          advanced: true,
        },
        remoteWorkspaceDir: {
          label: "Remote Workspace Dir",
          help: "Primary writable workspace inside the OpenShell sandbox.",
          advanced: true,
        },
        remoteAgentWorkspaceDir: {
          label: "Remote Agent Dir",
          help: "Mirror path for the real agent workspace when workspaceAccess is read-only.",
          advanced: true,
        },
        timeoutSeconds: {
          label: "Command Timeout Seconds",
          help: "Timeout for openshell CLI operations such as create/upload/download.",
          advanced: true,
        },
      },
    },
  },
  {
    dirName: "perplexity",
    idHint: "perplexity-plugin",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/perplexity-plugin",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Perplexity plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "perplexity",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          webSearch: {
            type: "object",
            additionalProperties: false,
            properties: {
              apiKey: {
                type: ["string", "object"],
              },
              baseUrl: {
                type: "string",
              },
              model: {
                type: "string",
              },
            },
          },
        },
      },
      providerAuthEnvVars: {
        perplexity: ["PERPLEXITY_API_KEY", "OPENROUTER_API_KEY"],
      },
      uiHints: {
        "webSearch.apiKey": {
          label: "Perplexity API Key",
          help: "Perplexity or OpenRouter API key for web search.",
          sensitive: true,
          placeholder: "pplx-...",
        },
        "webSearch.baseUrl": {
          label: "Perplexity Base URL",
          help: "Optional Perplexity/OpenRouter chat-completions base URL override.",
        },
        "webSearch.model": {
          label: "Perplexity Model",
          help: "Optional Sonar/OpenRouter model override.",
        },
      },
    },
  },
  {
    dirName: "qianfan",
    idHint: "qianfan",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/qianfan-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Qianfan provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "qianfan",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["qianfan"],
      providerAuthEnvVars: {
        qianfan: ["QIANFAN_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "qianfan",
          method: "api-key",
          choiceId: "qianfan-api-key",
          choiceLabel: "Qianfan API key",
          groupId: "qianfan",
          groupLabel: "Qianfan",
          groupHint: "API key",
          optionKey: "qianfanApiKey",
          cliFlag: "--qianfan-api-key",
          cliOption: "--qianfan-api-key <key>",
          cliDescription: "QIANFAN API key",
        },
      ],
    },
  },
  {
    dirName: "sglang",
    idHint: "sglang",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/sglang-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw SGLang provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "sglang",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["sglang"],
      providerAuthEnvVars: {
        sglang: ["SGLANG_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "sglang",
          method: "custom",
          choiceId: "sglang",
          choiceLabel: "SGLang",
          choiceHint: "Fast self-hosted OpenAI-compatible server",
          groupId: "sglang",
          groupLabel: "SGLang",
          groupHint: "Fast self-hosted server",
        },
      ],
    },
  },
  {
    dirName: "signal",
    idHint: "signal",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/signal",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Signal channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "signal",
        label: "Signal",
        selectionLabel: "Signal (signal-cli)",
        detailLabel: "Signal REST",
        docsPath: "/channels/signal",
        docsLabel: "signal",
        blurb: 'signal-cli linked device; more setup (David Reagans: "Hop on Discord.").',
        systemImage: "antenna.radiowaves.left.and.right",
      },
    },
    manifest: {
      id: "signal",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["signal"],
    },
  },
  {
    dirName: "slack",
    idHint: "slack",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/slack",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Slack channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "slack",
        label: "Slack",
        selectionLabel: "Slack (Socket Mode)",
        detailLabel: "Slack Bot",
        docsPath: "/channels/slack",
        docsLabel: "slack",
        blurb: "supported (Socket Mode).",
        systemImage: "number",
      },
    },
    manifest: {
      id: "slack",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["slack"],
    },
  },
  {
    dirName: "synology-chat",
    idHint: "synology-chat",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/synology-chat",
    packageVersion: "2026.3.22",
    packageDescription: "Synology Chat channel plugin for OpenClaw",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "synology-chat",
        label: "Synology Chat",
        selectionLabel: "Synology Chat (Webhook)",
        docsPath: "/channels/synology-chat",
        docsLabel: "synology-chat",
        blurb: "Connect your Synology NAS Chat to OpenClaw with full agent capabilities.",
        order: 90,
      },
      install: {
        npmSpec: "@openclaw/synology-chat",
        localPath: "extensions/synology-chat",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "synology-chat",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["synology-chat"],
    },
  },
  {
    dirName: "synthetic",
    idHint: "synthetic",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/synthetic-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Synthetic provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "synthetic",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["synthetic"],
      providerAuthEnvVars: {
        synthetic: ["SYNTHETIC_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "synthetic",
          method: "api-key",
          choiceId: "synthetic-api-key",
          choiceLabel: "Synthetic API key",
          groupId: "synthetic",
          groupLabel: "Synthetic",
          groupHint: "Anthropic-compatible (multi-model)",
          optionKey: "syntheticApiKey",
          cliFlag: "--synthetic-api-key",
          cliOption: "--synthetic-api-key <key>",
          cliDescription: "Synthetic API key",
        },
      ],
    },
  },
  {
    dirName: "tavily",
    idHint: "tavily-plugin",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/tavily-plugin",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Tavily plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "tavily",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          webSearch: {
            type: "object",
            additionalProperties: false,
            properties: {
              apiKey: {
                type: ["string", "object"],
              },
              baseUrl: {
                type: "string",
              },
            },
          },
        },
      },
      providerAuthEnvVars: {
        tavily: ["TAVILY_API_KEY"],
      },
      skills: ["./skills"],
      uiHints: {
        "webSearch.apiKey": {
          label: "Tavily API Key",
          help: "Tavily API key for web search and extraction (fallback: TAVILY_API_KEY env var).",
          sensitive: true,
          placeholder: "tvly-...",
        },
        "webSearch.baseUrl": {
          label: "Tavily Base URL",
          help: "Tavily API base URL override.",
        },
      },
    },
  },
  {
    dirName: "telegram",
    idHint: "telegram",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/telegram",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Telegram channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "telegram",
        label: "Telegram",
        selectionLabel: "Telegram (Bot API)",
        detailLabel: "Telegram Bot",
        docsPath: "/channels/telegram",
        docsLabel: "telegram",
        blurb: "simplest way to get started — register a bot with @BotFather and get going.",
        systemImage: "paperplane",
      },
    },
    manifest: {
      id: "telegram",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["telegram"],
    },
  },
  {
    dirName: "tlon",
    idHint: "tlon",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/tlon",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Tlon/Urbit channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "tlon",
        label: "Tlon",
        selectionLabel: "Tlon (Urbit)",
        docsPath: "/channels/tlon",
        docsLabel: "tlon",
        blurb: "decentralized messaging on Urbit; install the plugin to enable.",
        order: 90,
        quickstartAllowFrom: true,
      },
      install: {
        npmSpec: "@openclaw/tlon",
        localPath: "extensions/tlon",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "tlon",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["tlon"],
      skills: ["node_modules/@tloncorp/tlon-skill"],
    },
  },
  {
    dirName: "together",
    idHint: "together",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/together-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Together provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "together",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["together"],
      providerAuthEnvVars: {
        together: ["TOGETHER_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "together",
          method: "api-key",
          choiceId: "together-api-key",
          choiceLabel: "Together AI API key",
          groupId: "together",
          groupLabel: "Together AI",
          groupHint: "API key",
          optionKey: "togetherApiKey",
          cliFlag: "--together-api-key",
          cliOption: "--together-api-key <key>",
          cliDescription: "Together AI API key",
        },
      ],
    },
  },
  {
    dirName: "twitch",
    idHint: "twitch",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/twitch",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Twitch channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      channel: {
        id: "twitch",
        label: "Twitch",
        selectionLabel: "Twitch (Chat)",
        docsPath: "/channels/twitch",
        blurb: "Twitch chat integration",
        aliases: ["twitch-chat"],
      },
      install: {
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "twitch",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["twitch"],
    },
  },
  {
    dirName: "venice",
    idHint: "venice",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/venice-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Venice provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "venice",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["venice"],
      providerAuthEnvVars: {
        venice: ["VENICE_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "venice",
          method: "api-key",
          choiceId: "venice-api-key",
          choiceLabel: "Venice AI API key",
          groupId: "venice",
          groupLabel: "Venice AI",
          groupHint: "Privacy-focused (uncensored models)",
          optionKey: "veniceApiKey",
          cliFlag: "--venice-api-key",
          cliOption: "--venice-api-key <key>",
          cliDescription: "Venice API key",
        },
      ],
    },
  },
  {
    dirName: "vercel-ai-gateway",
    idHint: "vercel-ai-gateway",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/vercel-ai-gateway-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Vercel AI Gateway provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "vercel-ai-gateway",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["vercel-ai-gateway"],
      providerAuthEnvVars: {
        "vercel-ai-gateway": ["AI_GATEWAY_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "vercel-ai-gateway",
          method: "api-key",
          choiceId: "ai-gateway-api-key",
          choiceLabel: "Vercel AI Gateway API key",
          groupId: "ai-gateway",
          groupLabel: "Vercel AI Gateway",
          groupHint: "API key",
          optionKey: "aiGatewayApiKey",
          cliFlag: "--ai-gateway-api-key",
          cliOption: "--ai-gateway-api-key <key>",
          cliDescription: "Vercel AI Gateway API key",
        },
      ],
    },
  },
  {
    dirName: "vllm",
    idHint: "vllm",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/vllm-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw vLLM provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "vllm",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["vllm"],
      providerAuthEnvVars: {
        vllm: ["VLLM_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "vllm",
          method: "custom",
          choiceId: "vllm",
          choiceLabel: "vLLM",
          choiceHint: "Local/self-hosted OpenAI-compatible server",
          groupId: "vllm",
          groupLabel: "vLLM",
          groupHint: "Local/self-hosted OpenAI-compatible",
        },
      ],
    },
  },
  {
    dirName: "voice-call",
    idHint: "voice-call",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/voice-call",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw voice-call plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      install: {
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "voice-call",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          enabled: {
            type: "boolean",
          },
          provider: {
            type: "string",
            enum: ["telnyx", "twilio", "plivo", "mock"],
          },
          telnyx: {
            type: "object",
            additionalProperties: false,
            properties: {
              apiKey: {
                type: "string",
              },
              connectionId: {
                type: "string",
              },
              publicKey: {
                type: "string",
              },
            },
          },
          twilio: {
            type: "object",
            additionalProperties: false,
            properties: {
              accountSid: {
                type: "string",
              },
              authToken: {
                type: "string",
              },
            },
          },
          plivo: {
            type: "object",
            additionalProperties: false,
            properties: {
              authId: {
                type: "string",
              },
              authToken: {
                type: "string",
              },
            },
          },
          fromNumber: {
            type: "string",
            pattern: "^\\+[1-9]\\d{1,14}$",
          },
          toNumber: {
            type: "string",
            pattern: "^\\+[1-9]\\d{1,14}$",
          },
          inboundPolicy: {
            type: "string",
            enum: ["disabled", "allowlist", "pairing", "open"],
          },
          allowFrom: {
            type: "array",
            items: {
              type: "string",
              pattern: "^\\+[1-9]\\d{1,14}$",
            },
          },
          inboundGreeting: {
            type: "string",
          },
          outbound: {
            type: "object",
            additionalProperties: false,
            properties: {
              defaultMode: {
                type: "string",
                enum: ["notify", "conversation"],
              },
              notifyHangupDelaySec: {
                type: "integer",
                minimum: 0,
              },
            },
          },
          maxDurationSeconds: {
            type: "integer",
            minimum: 1,
          },
          staleCallReaperSeconds: {
            type: "integer",
            minimum: 0,
          },
          silenceTimeoutMs: {
            type: "integer",
            minimum: 1,
          },
          transcriptTimeoutMs: {
            type: "integer",
            minimum: 1,
          },
          ringTimeoutMs: {
            type: "integer",
            minimum: 1,
          },
          maxConcurrentCalls: {
            type: "integer",
            minimum: 1,
          },
          serve: {
            type: "object",
            additionalProperties: false,
            properties: {
              port: {
                type: "integer",
                minimum: 1,
              },
              bind: {
                type: "string",
              },
              path: {
                type: "string",
              },
            },
          },
          tailscale: {
            type: "object",
            additionalProperties: false,
            properties: {
              mode: {
                type: "string",
                enum: ["off", "serve", "funnel"],
              },
              path: {
                type: "string",
              },
            },
          },
          tunnel: {
            type: "object",
            additionalProperties: false,
            properties: {
              provider: {
                type: "string",
                enum: ["none", "ngrok", "tailscale-serve", "tailscale-funnel"],
              },
              ngrokAuthToken: {
                type: "string",
              },
              ngrokDomain: {
                type: "string",
              },
              allowNgrokFreeTierLoopbackBypass: {
                type: "boolean",
              },
            },
          },
          webhookSecurity: {
            type: "object",
            additionalProperties: false,
            properties: {
              allowedHosts: {
                type: "array",
                items: {
                  type: "string",
                },
              },
              trustForwardingHeaders: {
                type: "boolean",
              },
              trustedProxyIPs: {
                type: "array",
                items: {
                  type: "string",
                },
              },
            },
          },
          streaming: {
            type: "object",
            additionalProperties: false,
            properties: {
              enabled: {
                type: "boolean",
              },
              sttProvider: {
                type: "string",
                enum: ["openai-realtime"],
              },
              openaiApiKey: {
                type: "string",
              },
              sttModel: {
                type: "string",
              },
              silenceDurationMs: {
                type: "integer",
                minimum: 1,
              },
              vadThreshold: {
                type: "number",
                minimum: 0,
                maximum: 1,
              },
              streamPath: {
                type: "string",
              },
              preStartTimeoutMs: {
                type: "integer",
                minimum: 1,
              },
              maxPendingConnections: {
                type: "integer",
                minimum: 1,
              },
              maxPendingConnectionsPerIp: {
                type: "integer",
                minimum: 1,
              },
              maxConnections: {
                type: "integer",
                minimum: 1,
              },
            },
          },
          publicUrl: {
            type: "string",
          },
          skipSignatureVerification: {
            type: "boolean",
          },
          stt: {
            type: "object",
            additionalProperties: false,
            properties: {
              provider: {
                type: "string",
                enum: ["openai"],
              },
              model: {
                type: "string",
              },
            },
          },
          tts: {
            type: "object",
            additionalProperties: false,
            properties: {
              auto: {
                type: "string",
                enum: ["off", "always", "inbound", "tagged"],
              },
              enabled: {
                type: "boolean",
              },
              mode: {
                type: "string",
                enum: ["final", "all"],
              },
              provider: {
                type: "string",
              },
              summaryModel: {
                type: "string",
              },
              modelOverrides: {
                type: "object",
                additionalProperties: false,
                properties: {
                  enabled: {
                    type: "boolean",
                  },
                  allowText: {
                    type: "boolean",
                  },
                  allowProvider: {
                    type: "boolean",
                  },
                  allowVoice: {
                    type: "boolean",
                  },
                  allowModelId: {
                    type: "boolean",
                  },
                  allowVoiceSettings: {
                    type: "boolean",
                  },
                  allowNormalization: {
                    type: "boolean",
                  },
                  allowSeed: {
                    type: "boolean",
                  },
                },
              },
              elevenlabs: {
                type: "object",
                additionalProperties: false,
                properties: {
                  apiKey: {
                    type: "string",
                  },
                  baseUrl: {
                    type: "string",
                  },
                  voiceId: {
                    type: "string",
                  },
                  modelId: {
                    type: "string",
                  },
                  seed: {
                    type: "integer",
                    minimum: 0,
                    maximum: 4294967295,
                  },
                  applyTextNormalization: {
                    type: "string",
                    enum: ["auto", "on", "off"],
                  },
                  languageCode: {
                    type: "string",
                  },
                  voiceSettings: {
                    type: "object",
                    additionalProperties: false,
                    properties: {
                      stability: {
                        type: "number",
                        minimum: 0,
                        maximum: 1,
                      },
                      similarityBoost: {
                        type: "number",
                        minimum: 0,
                        maximum: 1,
                      },
                      style: {
                        type: "number",
                        minimum: 0,
                        maximum: 1,
                      },
                      useSpeakerBoost: {
                        type: "boolean",
                      },
                      speed: {
                        type: "number",
                        minimum: 0.5,
                        maximum: 2,
                      },
                    },
                  },
                },
              },
              openai: {
                type: "object",
                additionalProperties: false,
                properties: {
                  apiKey: {
                    type: "string",
                  },
                  baseUrl: {
                    type: "string",
                  },
                  model: {
                    type: "string",
                  },
                  voice: {
                    type: "string",
                  },
                  speed: {
                    type: "number",
                    minimum: 0.25,
                    maximum: 4,
                  },
                  instructions: {
                    type: "string",
                  },
                },
              },
              edge: {
                type: "object",
                additionalProperties: false,
                properties: {
                  enabled: {
                    type: "boolean",
                  },
                  voice: {
                    type: "string",
                  },
                  lang: {
                    type: "string",
                  },
                  outputFormat: {
                    type: "string",
                  },
                  pitch: {
                    type: "string",
                  },
                  rate: {
                    type: "string",
                  },
                  volume: {
                    type: "string",
                  },
                  saveSubtitles: {
                    type: "boolean",
                  },
                  proxy: {
                    type: "string",
                  },
                  timeoutMs: {
                    type: "integer",
                    minimum: 1000,
                    maximum: 120000,
                  },
                },
              },
              prefsPath: {
                type: "string",
              },
              maxTextLength: {
                type: "integer",
                minimum: 1,
              },
              timeoutMs: {
                type: "integer",
                minimum: 1000,
                maximum: 120000,
              },
            },
          },
          store: {
            type: "string",
          },
          responseModel: {
            type: "string",
          },
          responseSystemPrompt: {
            type: "string",
          },
          responseTimeoutMs: {
            type: "integer",
            minimum: 1,
          },
        },
      },
      uiHints: {
        provider: {
          label: "Provider",
          help: "Use twilio, telnyx, or mock for dev/no-network.",
        },
        fromNumber: {
          label: "From Number",
          placeholder: "+15550001234",
        },
        toNumber: {
          label: "Default To Number",
          placeholder: "+15550001234",
        },
        inboundPolicy: {
          label: "Inbound Policy",
        },
        allowFrom: {
          label: "Inbound Allowlist",
        },
        inboundGreeting: {
          label: "Inbound Greeting",
          advanced: true,
        },
        "telnyx.apiKey": {
          label: "Telnyx API Key",
          sensitive: true,
        },
        "telnyx.connectionId": {
          label: "Telnyx Connection ID",
        },
        "telnyx.publicKey": {
          label: "Telnyx Public Key",
          sensitive: true,
        },
        "twilio.accountSid": {
          label: "Twilio Account SID",
        },
        "twilio.authToken": {
          label: "Twilio Auth Token",
          sensitive: true,
        },
        "outbound.defaultMode": {
          label: "Default Call Mode",
        },
        "outbound.notifyHangupDelaySec": {
          label: "Notify Hangup Delay (sec)",
          advanced: true,
        },
        "serve.port": {
          label: "Webhook Port",
        },
        "serve.bind": {
          label: "Webhook Bind",
        },
        "serve.path": {
          label: "Webhook Path",
        },
        "tailscale.mode": {
          label: "Tailscale Mode",
          advanced: true,
        },
        "tailscale.path": {
          label: "Tailscale Path",
          advanced: true,
        },
        "tunnel.provider": {
          label: "Tunnel Provider",
          advanced: true,
        },
        "tunnel.ngrokAuthToken": {
          label: "ngrok Auth Token",
          sensitive: true,
          advanced: true,
        },
        "tunnel.ngrokDomain": {
          label: "ngrok Domain",
          advanced: true,
        },
        "tunnel.allowNgrokFreeTierLoopbackBypass": {
          label: "Allow ngrok Free Tier (Loopback Bypass)",
          advanced: true,
        },
        "streaming.enabled": {
          label: "Enable Streaming",
          advanced: true,
        },
        "streaming.openaiApiKey": {
          label: "OpenAI Realtime API Key",
          sensitive: true,
          advanced: true,
        },
        "streaming.sttModel": {
          label: "Realtime STT Model",
          advanced: true,
        },
        "streaming.streamPath": {
          label: "Media Stream Path",
          advanced: true,
        },
        "tts.provider": {
          label: "TTS Provider Override",
          help: "Deep-merges with messages.tts (Microsoft is ignored for calls).",
          advanced: true,
        },
        "tts.openai.model": {
          label: "OpenAI TTS Model",
          advanced: true,
        },
        "tts.openai.voice": {
          label: "OpenAI TTS Voice",
          advanced: true,
        },
        "tts.openai.apiKey": {
          label: "OpenAI API Key",
          sensitive: true,
          advanced: true,
        },
        "tts.elevenlabs.modelId": {
          label: "ElevenLabs Model ID",
          advanced: true,
        },
        "tts.elevenlabs.voiceId": {
          label: "ElevenLabs Voice ID",
          advanced: true,
        },
        "tts.elevenlabs.apiKey": {
          label: "ElevenLabs API Key",
          sensitive: true,
          advanced: true,
        },
        "tts.elevenlabs.baseUrl": {
          label: "ElevenLabs Base URL",
          advanced: true,
        },
        publicUrl: {
          label: "Public Webhook URL",
          advanced: true,
        },
        skipSignatureVerification: {
          label: "Skip Signature Verification",
          advanced: true,
        },
        store: {
          label: "Call Log Store Path",
          advanced: true,
        },
        responseModel: {
          label: "Response Model",
          advanced: true,
        },
        responseSystemPrompt: {
          label: "Response System Prompt",
          advanced: true,
        },
        responseTimeoutMs: {
          label: "Response Timeout (ms)",
          advanced: true,
        },
      },
    },
  },
  {
    dirName: "volcengine",
    idHint: "volcengine",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/volcengine-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Volcengine provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "volcengine",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["volcengine", "volcengine-plan"],
      providerAuthEnvVars: {
        volcengine: ["VOLCANO_ENGINE_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "volcengine",
          method: "api-key",
          choiceId: "volcengine-api-key",
          choiceLabel: "Volcano Engine API key",
          groupId: "volcengine",
          groupLabel: "Volcano Engine",
          groupHint: "API key",
          optionKey: "volcengineApiKey",
          cliFlag: "--volcengine-api-key",
          cliOption: "--volcengine-api-key <key>",
          cliDescription: "Volcano Engine API key",
        },
      ],
    },
  },
  {
    dirName: "whatsapp",
    idHint: "whatsapp",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/whatsapp",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw WhatsApp channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "whatsapp",
        label: "WhatsApp",
        selectionLabel: "WhatsApp (QR link)",
        detailLabel: "WhatsApp Web",
        docsPath: "/channels/whatsapp",
        docsLabel: "whatsapp",
        blurb: "works with your own number; recommend a separate phone + eSIM.",
        systemImage: "message",
      },
      install: {
        npmSpec: "@openclaw/whatsapp",
        localPath: "extensions/whatsapp",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "whatsapp",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["whatsapp"],
    },
  },
  {
    dirName: "xai",
    idHint: "xai-plugin",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/xai-plugin",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw xAI plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "xai",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {
          webSearch: {
            type: "object",
            additionalProperties: false,
            properties: {
              apiKey: {
                type: ["string", "object"],
              },
              model: {
                type: "string",
              },
              inlineCitations: {
                type: "boolean",
              },
            },
          },
        },
      },
      providers: ["xai"],
      providerAuthEnvVars: {
        xai: ["XAI_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "xai",
          method: "api-key",
          choiceId: "xai-api-key",
          choiceLabel: "xAI API key",
          groupId: "xai",
          groupLabel: "xAI (Grok)",
          groupHint: "API key",
          optionKey: "xaiApiKey",
          cliFlag: "--xai-api-key",
          cliOption: "--xai-api-key <key>",
          cliDescription: "xAI API key",
        },
      ],
      uiHints: {
        "webSearch.apiKey": {
          label: "Grok Search API Key",
          help: "xAI API key for Grok web search (fallback: XAI_API_KEY env var).",
          sensitive: true,
        },
        "webSearch.model": {
          label: "Grok Search Model",
          help: "Grok model override for web search.",
        },
        "webSearch.inlineCitations": {
          label: "Inline Citations",
          help: "Include inline markdown citations in Grok responses.",
        },
      },
    },
  },
  {
    dirName: "xiaomi",
    idHint: "xiaomi",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/xiaomi-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Xiaomi provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "xiaomi",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["xiaomi"],
      providerAuthEnvVars: {
        xiaomi: ["XIAOMI_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "xiaomi",
          method: "api-key",
          choiceId: "xiaomi-api-key",
          choiceLabel: "Xiaomi API key",
          groupId: "xiaomi",
          groupLabel: "Xiaomi",
          groupHint: "API key",
          optionKey: "xiaomiApiKey",
          cliFlag: "--xiaomi-api-key",
          cliOption: "--xiaomi-api-key <key>",
          cliDescription: "Xiaomi API key",
        },
      ],
    },
  },
  {
    dirName: "zai",
    idHint: "zai",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    packageName: "@openclaw/zai-provider",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Z.AI provider plugin",
    packageManifest: {
      extensions: ["./index.ts"],
    },
    manifest: {
      id: "zai",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      providers: ["zai"],
      providerAuthEnvVars: {
        zai: ["ZAI_API_KEY", "Z_AI_API_KEY"],
      },
      providerAuthChoices: [
        {
          provider: "zai",
          method: "api-key",
          choiceId: "zai-api-key",
          choiceLabel: "Z.AI API key",
          groupId: "zai",
          groupLabel: "Z.AI",
          groupHint: "GLM Coding Plan / Global / CN",
          optionKey: "zaiApiKey",
          cliFlag: "--zai-api-key",
          cliOption: "--zai-api-key <key>",
          cliDescription: "Z.AI API key",
        },
        {
          provider: "zai",
          method: "coding-global",
          choiceId: "zai-coding-global",
          choiceLabel: "Coding-Plan-Global",
          choiceHint: "GLM Coding Plan Global (api.z.ai)",
          groupId: "zai",
          groupLabel: "Z.AI",
          groupHint: "GLM Coding Plan / Global / CN",
          optionKey: "zaiApiKey",
          cliFlag: "--zai-api-key",
          cliOption: "--zai-api-key <key>",
          cliDescription: "Z.AI API key",
        },
        {
          provider: "zai",
          method: "coding-cn",
          choiceId: "zai-coding-cn",
          choiceLabel: "Coding-Plan-CN",
          choiceHint: "GLM Coding Plan CN (open.bigmodel.cn)",
          groupId: "zai",
          groupLabel: "Z.AI",
          groupHint: "GLM Coding Plan / Global / CN",
          optionKey: "zaiApiKey",
          cliFlag: "--zai-api-key",
          cliOption: "--zai-api-key <key>",
          cliDescription: "Z.AI API key",
        },
        {
          provider: "zai",
          method: "global",
          choiceId: "zai-global",
          choiceLabel: "Global",
          choiceHint: "Z.AI Global (api.z.ai)",
          groupId: "zai",
          groupLabel: "Z.AI",
          groupHint: "GLM Coding Plan / Global / CN",
          optionKey: "zaiApiKey",
          cliFlag: "--zai-api-key",
          cliOption: "--zai-api-key <key>",
          cliDescription: "Z.AI API key",
        },
        {
          provider: "zai",
          method: "cn",
          choiceId: "zai-cn",
          choiceLabel: "CN",
          choiceHint: "Z.AI CN (open.bigmodel.cn)",
          groupId: "zai",
          groupLabel: "Z.AI",
          groupHint: "GLM Coding Plan / Global / CN",
          optionKey: "zaiApiKey",
          cliFlag: "--zai-api-key",
          cliOption: "--zai-api-key <key>",
          cliDescription: "Z.AI API key",
        },
      ],
    },
  },
  {
    dirName: "zalo",
    idHint: "zalo",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/zalo",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Zalo channel plugin",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "zalo",
        label: "Zalo",
        selectionLabel: "Zalo (Bot API)",
        docsPath: "/channels/zalo",
        docsLabel: "zalo",
        blurb: "Vietnam-focused messaging platform with Bot API.",
        aliases: ["zl"],
        order: 80,
        quickstartAllowFrom: true,
      },
      install: {
        npmSpec: "@openclaw/zalo",
        localPath: "extensions/zalo",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "zalo",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["zalo"],
    },
  },
  {
    dirName: "zalouser",
    idHint: "zalouser",
    source: {
      source: "./index.ts",
      built: "index.js",
    },
    setupSource: {
      source: "./setup-entry.ts",
      built: "setup-entry.js",
    },
    packageName: "@openclaw/zalouser",
    packageVersion: "2026.3.22",
    packageDescription: "OpenClaw Zalo Personal Account plugin via native zca-js integration",
    packageManifest: {
      extensions: ["./index.ts"],
      setupEntry: "./setup-entry.ts",
      channel: {
        id: "zalouser",
        label: "Zalo Personal",
        selectionLabel: "Zalo (Personal Account)",
        docsPath: "/channels/zalouser",
        docsLabel: "zalouser",
        blurb: "Zalo personal account via QR code login.",
        aliases: ["zlu"],
        order: 85,
        quickstartAllowFrom: false,
      },
      install: {
        npmSpec: "@openclaw/zalouser",
        localPath: "extensions/zalouser",
        defaultChoice: "npm",
        minHostVersion: ">=2026.3.22",
      },
    },
    manifest: {
      id: "zalouser",
      configSchema: {
        type: "object",
        additionalProperties: false,
        properties: {},
      },
      channels: ["zalouser"],
    },
  },
] as const;
