Put Claude Code and Codex Inside WeChat, Lark and DingTalk with LangBot Runner Plugins The LangBot project released version 4.11, which removes the nine built-in runners from src/langbot/pkg/provider/runners/ and turns runners into installable plugin components, letting teams run Claude Code and Codex agents from WeChat Work, Lark and DingTalk group chats. The release adds a RunnerRegistry that discovers plugin runners over LIST_RUNNERS and generates ids as plugin:author/plugin_name/runner_name, plus a twelve-package adapter layer under src/langbot/pkg/platform/adapters/, with official ClaudeCodeAgent and CodexAgent plugin ids. Runner plugins execute in a separate plugin-runtime container, making deployment a two-container setup. A team already lives in Claude Code and Codex — repos, shell, MCP servers on their own machines. Colleagues should reach that same power from WeChat Work, Lark and DingTalk group chats, without a terminal. On 4.10 that was awkward — not inbound: 4.10.11 already ships openclaw weixin , lark , dingtalk under src/langbot/pkg/platform/sources/ . The processing side was the wall: nine built-in runners under src/langbot/pkg/provider/runners/ localagent.py , difysvapi.py , … weknoraapi.py , so adding Claude Code meant patching LangBot or wrapping the CLI in an HTTP service outside the bot. 4.11 flips that: a Runner is a plugin, and the platform is only the event source . Support depends on the adapter and platform — check the support matrix first. New in 4.11: the built-in runners are gone. src/langbot/pkg/provider/runners/ holds ten files at v4.10.11 and does not exist at v4.11.0 ; src/langbot/pkg/provider/ keeps only modelmgr/ , session/ , tools/ git ls-tree , both revisions . A Runner is a plugin component. The runtime reports installed plugins' runners over LIST RUNNERS ; the host discovers and caches them in RunnerRegistry src/langbot/pkg/agent/runner/registry.py:20,24,152 , generating ids as plugin:author/plugin name/runner name src/langbot/pkg/agent/runner/id.py:24-27 and rejecting anything without that prefix id.py:52-57 ; PROTOCOL V1.md §13 . The manifest is the contract : id , name , label , description , capabilities , permissions , config schema , metadata §4.2 ; capabilities is a typed boolean model for UI and resource projection, not a permission grant, and permissions is the access ceiling, intersected with the binding policy. Official ids : plugin:langbot-team/ClaudeCodeAgent/default , plugin:langbot-team/CodexAgent/default docs/agent-runner-pluginization/OFFICIAL RUNNER PLUGINS.md:33-34 . New in 4.11: the adapter layer. src/langbot/pkg/platform/adapters/ is absent at v4.10.11 ; 4.11 splits it into twelve packages with manifest.yaml , adapter.py , event converter.py , and the Lark manifest declares kind: MessagePlatformAdapter src/langbot/pkg/platform/adapters/lark/manifest.yaml:1-4,13 . The inbound file inventory is unchanged : between v4.10.11 and v4.11.0 , all 22 files under src/langbot/pkg/platform/sources/ are modifications — no additions, no deletions — so no new platform arrived here. Where config lands : ai.runner.id stores the runner id and ai.runner config