Skip to content

fix(feishu): remove duplicate tool registration#52590

Open
QuinnH496 wants to merge 2 commits intoopenclaw:mainfrom
QuinnH496:fix/feishu-duplicate-tool-registration
Open

fix(feishu): remove duplicate tool registration#52590
QuinnH496 wants to merge 2 commits intoopenclaw:mainfrom
QuinnH496:fix/feishu-duplicate-tool-registration

Conversation

@QuinnH496
Copy link
Copy Markdown
Contributor

Summary

The Feishu plugin registers every tool twice — visible via [plugins] [debug] Database schema initialized
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] [debug] Telemetry initialized (PostHog)
[plugins] memos-local: installed bundled skill memos-memory-guide → /home/ubuntu/.openclaw/workspace/skills/memos-memory-guide
[plugins] memos-local: installed bundled skill memos-memory-guide → /home/ubuntu/.openclaw/skills/memos-memory-guide (managed)
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] memos-local: initialized (db: /home/ubuntu/.openclaw/memos-local/memos.db)
[plugins] [debug] Database schema initialized
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] [debug] Telemetry initialized (PostHog)
[plugins] memos-local: installed bundled skill memos-memory-guide → /home/ubuntu/.openclaw/workspace/skills/memos-memory-guide
[plugins] memos-local: installed bundled skill memos-memory-guide → /home/ubuntu/.openclaw/skills/memos-memory-guide (managed)
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] memos-local: initialized (db: /home/ubuntu/.openclaw/memos-local/memos.db)
[qqbot] resolveAllowFrom: accountId=default, allowFrom=["*"]
Gateway connection:
Gateway target: ws://127.0.0.1:18789
Source: local loopback
Config: /home/ubuntu/.openclaw/openclaw.json
Bind: loopback

OpenClaw status

Overview
┌─────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Item │ Value │
├─────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Dashboard │ http://127.0.0.1:18789/
│ OS │ linux 6.17.0-1007-aws (x64) · node 24.14.0 │
│ Tailscale │ off │
│ Channel │ stable (default) │
│ Update │ pnpm · npm latest 2026.3.13 │
│ Gateway │ local · ws://127.0.0.1:18789 (local loopback) · unreachable (missing scope: operator.read) │
│ Gateway service │ systemd installed · enabled · running (pid 142064, state active) │
│ Node service │ systemd not installed │
│ Agents │ 1 · 1 bootstrap file present · sessions 7 · default main active 2m ago │
│ Memory │ enabled (plugin memos-local-openclaw-plugin) │
│ Probes │ skipped (use --deep) │
│ Events │ none │
│ Heartbeat │ 30m (main) │
│ Sessions │ 7 active · default xiaomi/mimo-v2-omni (262k ctx) · ~/.openclaw/agents/main/sessions/sessions.json │
└─────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘

Security audit
Summary: 1 critical · 5 warn · 1 info
CRITICAL Small models require sandboxing and web tools disabled
Small models (<=300B params) detected: - openrouter/nvidia/nemotron-3-super-120b-a12b:free (120B) @ agents.defaults.model.fallbacks (unsafe; sandbox=off; web=[…
Fix: If you must use small models, enable sandboxing for all sessions (agents.defaults.sandbox.mode="all") and disable web_search/web_fetch/browser (tools.deny=["group:web","browser"]).
WARN Reverse proxy headers are not trusted
gateway.bind is loopback and gateway.trustedProxies is empty. If you expose the Control UI through a reverse proxy, configure trusted proxies so local-client c…
Fix: Set gateway.trustedProxies to your proxy IPs or keep the Control UI local-only.
WARN Some gateway.nodes.denyCommands entries are ineffective
gateway.nodes.denyCommands uses exact node command-name matching only (for example system.run), not shell-text filtering inside a command payload. - Unknown …
Fix: Use exact command names (for example: canvas.present, canvas.hide, canvas.navigate, canvas.eval, canvas.snapshot, canvas.a2ui.push, canvas.a2ui.pushJSONL, canvas.a2ui.reset). If you need broader restrictions, remove risky command IDs from allowCommands/default workflows and tighten tools.exec policy.
WARN Potential multi-user setup detected (personal-assistant model warning)
Heuristic signals indicate this gateway may be reachable by multiple users: - channels.qqbot.allowFrom includes "*" Runtime/process tools are exposed without f…
Fix: If users may be mutually untrusted, split trust boundaries (separate gateways + credentials, ideally separate OS users/hosts). If you intentionally run shared-user access, set agents.defaults.sandbox.mode="all", keep tools.fs.workspaceOnly=true, deny runtime/fs/web tools unless required, and keep personal/private identities + credentials off that runtime.
WARN Extensions exist but plugins.allow is not set
Found 3 extension(s) under /home/ubuntu/.openclaw/extensions. Without plugins.allow, any discovered plugin id may load (depending on config and plugin behavior…
Fix: Set plugins.allow to an explicit list of plugin ids you trust.
WARN Plugin installs include unpinned npm specs
Unpinned plugin install records: - openclaw-qqbot (@tencent-connect/openclaw-qqbot@latest) - mem9 (@mem9/mem9) - memos-local-openclaw-plugin (@memtensor/memos-…
Fix: Pin install specs to exact versions (for example, @scope/[email protected]) for higher supply-chain stability.
Full report: openclaw security audit
Deep probe: openclaw security audit --deep

Channels
┌──────────┬─────────┬────────┬────────────────────────────────────────────────────────────────────────────────────────┐
│ Channel │ Enabled │ State │ Detail │
├──────────┼─────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────┤
│ QQ Bot │ ON │ OK │ configured │
└──────────┴─────────┴────────┴────────────────────────────────────────────────────────────────────────────────────────┘

Sessions
┌──────────────────────────────────────┬────────┬─────────┬─────────────────────────┬──────────────────────────────────┐
│ Key │ Kind │ Age │ Model │ Tokens │
├──────────────────────────────────────┼────────┼─────────┼─────────────────────────┼──────────────────────────────────┤
│ agent:main:qqbot:direct:c784af3… │ direct │ 2m ago │ xiaomi/mimo-v2-omni │ 88k/262k (33%) · 🗄️ 0% cached │
│ agent:main:main │ direct │ 26m ago │ xiaomi/mimo-v2-omni │ 25k/262k (10%) · 🗄️ 0% cached │
│ agent:main:cron:948c08c7-05e3-4… │ direct │ 15h ago │ xiaomi/mimo-v2-omni │ 25k/262k (10%) · 🗄️ 402% cached │
│ agent:main:cron:948c08c7-05e3-4… │ direct │ 15h ago │ xiaomi/mimo-v2-omni │ 25k/262k (10%) · 🗄️ 402% cached │
│ agent:main:cron:bc0a830d-eb16-4… │ direct │ 5d ago │ openrouter/healer-alpha │ 35k/262k (13%) · 🗄️ 1349% cached │
│ agent:main:cron:20e2e014-0388-4… │ direct │ 5d ago │ openrouter/healer-alpha │ 33k/262k (13%) · 🗄️ 429% cached │
│ agent:main:cron:3037f795-1b38-4… │ direct │ 5d ago │ openrouter/healer-alpha │ 34k/262k (13%) · 🗄️ 536% cached │
└──────────────────────────────────────┴────────┴─────────┴─────────────────────────┴──────────────────────────────────┘

FAQ: https://docs.openclaw.ai/faq
Troubleshooting: https://docs.openclaw.ai/troubleshooting

Next steps:
Need to share? openclaw status --all
Need to debug live? openclaw logs --follow
Fix reachability first: openclaw gateway probe on v2026.3.13.

Root Cause

Two overlapping registration paths both fire during plugin load:

  1. declares → auto-discovers and registers all tools in the directory
  2. calls , , etc. → registers the same tools again

Fix

Removed the skills field from extensions/feishu/openclaw.plugin.json. The manual registerXxxTools() calls in index.ts are the intended primary registration path — they also handle setFeishuRuntime() and registerChannel(), keeping all plugin initialization in one place.

Test

openclaw status --verbose should now show each feishu tool (doc, chat, wiki, drive, perm, bitable) exactly once.

Issue

Fixes #52572

The feishu plugin registers tools twice:
1. Via skills: [./skills] in openclaw.plugin.json (auto-discovery)
2. Via manual registerXxxTools() calls in index.ts register()

Both paths fire during plugin load, resulting in every feishu
tool (doc, chat, wiki, drive, perm, bitable) appearing twice
in [plugins] [debug] Database schema initialized
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] [debug] Telemetry initialized (PostHog)
[plugins] memos-local: installed bundled skill memos-memory-guide → /home/ubuntu/.openclaw/workspace/skills/memos-memory-guide
[plugins] memos-local: installed bundled skill memos-memory-guide → /home/ubuntu/.openclaw/skills/memos-memory-guide (managed)
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] memos-local: initialized (db: /home/ubuntu/.openclaw/memos-local/memos.db)
[plugins] [debug] Database schema initialized
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] [debug] Telemetry initialized (PostHog)
[plugins] memos-local: installed bundled skill memos-memory-guide → /home/ubuntu/.openclaw/workspace/skills/memos-memory-guide
[plugins] memos-local: installed bundled skill memos-memory-guide → /home/ubuntu/.openclaw/skills/memos-memory-guide (managed)
[plugins] [debug] OpenClaw fallback model: xiaomi via https://openrouter.ai/api/v1
[plugins] memos-local: initialized (db: /home/ubuntu/.openclaw/memos-local/memos.db)
[qqbot] resolveAllowFrom: accountId=default, allowFrom=["*"]
Gateway connection:
  Gateway target: ws://127.0.0.1:18789
  Source: local loopback
  Config: /home/ubuntu/.openclaw/openclaw.json
  Bind: loopback

OpenClaw status

Overview
┌─────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Item            │ Value                                                                                              │
├─────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Dashboard       │ http://127.0.0.1:18789/                                                                            │
│ OS              │ linux 6.17.0-1007-aws (x64) · node 24.14.0                                                         │
│ Tailscale       │ off                                                                                                │
│ Channel         │ stable (default)                                                                                   │
│ Update          │ pnpm · npm latest 2026.3.13                                                                        │
│ Gateway         │ local · ws://127.0.0.1:18789 (local loopback) · unreachable (missing scope: operator.read)         │
│ Gateway service │ systemd installed · enabled · running (pid 142064, state active)                                   │
│ Node service    │ systemd not installed                                                                              │
│ Agents          │ 1 · 1 bootstrap file present · sessions 7 · default main active 1m ago                             │
│ Memory          │ enabled (plugin memos-local-openclaw-plugin)                                                       │
│ Probes          │ skipped (use --deep)                                                                               │
│ Events          │ none                                                                                               │
│ Heartbeat       │ 30m (main)                                                                                         │
│ Sessions        │ 7 active · default xiaomi/mimo-v2-omni (262k ctx) · ~/.openclaw/agents/main/sessions/sessions.json │
└─────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────┘

Security audit
Summary: 1 critical · 5 warn · 1 info
  CRITICAL Small models require sandboxing and web tools disabled
    Small models (<=300B params) detected: - openrouter/nvidia/nemotron-3-super-120b-a12b:free (120B) @ agents.defaults.model.fallbacks (unsafe; sandbox=off; web=[…
    Fix: If you must use small models, enable sandboxing for all sessions (agents.defaults.sandbox.mode="all") and disable web_search/web_fetch/browser (tools.deny=["group:web","browser"]).
  WARN Reverse proxy headers are not trusted
    gateway.bind is loopback and gateway.trustedProxies is empty. If you expose the Control UI through a reverse proxy, configure trusted proxies so local-client c…
    Fix: Set gateway.trustedProxies to your proxy IPs or keep the Control UI local-only.
  WARN Some gateway.nodes.denyCommands entries are ineffective
    gateway.nodes.denyCommands uses exact node command-name matching only (for example `system.run`), not shell-text filtering inside a command payload. - Unknown …
    Fix: Use exact command names (for example: canvas.present, canvas.hide, canvas.navigate, canvas.eval, canvas.snapshot, canvas.a2ui.push, canvas.a2ui.pushJSONL, canvas.a2ui.reset). If you need broader restrictions, remove risky command IDs from allowCommands/default workflows and tighten tools.exec policy.
  WARN Potential multi-user setup detected (personal-assistant model warning)
    Heuristic signals indicate this gateway may be reachable by multiple users: - channels.qqbot.allowFrom includes "*" Runtime/process tools are exposed without f…
    Fix: If users may be mutually untrusted, split trust boundaries (separate gateways + credentials, ideally separate OS users/hosts). If you intentionally run shared-user access, set agents.defaults.sandbox.mode="all", keep tools.fs.workspaceOnly=true, deny runtime/fs/web tools unless required, and keep personal/private identities + credentials off that runtime.
  WARN Extensions exist but plugins.allow is not set
    Found 3 extension(s) under /home/ubuntu/.openclaw/extensions. Without plugins.allow, any discovered plugin id may load (depending on config and plugin behavior…
    Fix: Set plugins.allow to an explicit list of plugin ids you trust.
  WARN Plugin installs include unpinned npm specs
    Unpinned plugin install records: - openclaw-qqbot (@tencent-connect/openclaw-qqbot@latest) - mem9 (@mem9/mem9) - memos-local-openclaw-plugin (@memtensor/memos-…
    Fix: Pin install specs to exact versions (for example, `@scope/[email protected]`) for higher supply-chain stability.
Full report: openclaw security audit
Deep probe: openclaw security audit --deep

Channels
┌──────────┬─────────┬────────┬────────────────────────────────────────────────────────────────────────────────────────┐
│ Channel  │ Enabled │ State  │ Detail                                                                                 │
├──────────┼─────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────┤
│ QQ Bot   │ ON      │ OK     │ configured                                                                             │
└──────────┴─────────┴────────┴────────────────────────────────────────────────────────────────────────────────────────┘

Sessions
┌──────────────────────────────────────┬────────┬─────────┬─────────────────────────┬──────────────────────────────────┐
│ Key                                  │ Kind   │ Age     │ Model                   │ Tokens                           │
├──────────────────────────────────────┼────────┼─────────┼─────────────────────────┼──────────────────────────────────┤
│ agent:main:qqbot:direct:c784af3…     │ direct │ 1m ago  │ xiaomi/mimo-v2-omni     │ 88k/262k (33%) · 🗄️ 0% cached    │
│ agent:main:main                      │ direct │ 25m ago │ xiaomi/mimo-v2-omni     │ 25k/262k (10%) · 🗄️ 0% cached    │
│ agent:main:cron:948c08c7-05e3-4…     │ direct │ 15h ago │ xiaomi/mimo-v2-omni     │ 25k/262k (10%) · 🗄️ 402% cached  │
│ agent:main:cron:948c08c7-05e3-4…     │ direct │ 15h ago │ xiaomi/mimo-v2-omni     │ 25k/262k (10%) · 🗄️ 402% cached  │
│ agent:main:cron:bc0a830d-eb16-4…     │ direct │ 5d ago  │ openrouter/healer-alpha │ 35k/262k (13%) · 🗄️ 1349% cached │
│ agent:main:cron:20e2e014-0388-4…     │ direct │ 5d ago  │ openrouter/healer-alpha │ 33k/262k (13%) · 🗄️ 429% cached  │
│ agent:main:cron:3037f795-1b38-4…     │ direct │ 5d ago  │ openrouter/healer-alpha │ 34k/262k (13%) · 🗄️ 536% cached  │
└──────────────────────────────────────┴────────┴─────────┴─────────────────────────┴──────────────────────────────────┘

FAQ: https://docs.openclaw.ai/faq
Troubleshooting: https://docs.openclaw.ai/troubleshooting

Next steps:
  Need to share?      openclaw status --all
  Need to debug live? openclaw logs --follow
  Fix reachability first: openclaw gateway probe.

Removing the declarative skills field lets index.ts be the sole
registration entry point, which also handles setFeishuRuntime()
and registerChannel() — keeping all plugin init in one place.

Fixes openclaw#52572
@openclaw-barnacle openclaw-barnacle bot added channel: feishu Channel integration: feishu size: XS labels Mar 23, 2026
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e599465ae2

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines 3 to 4
"channels": ["feishu"],
"skills": ["./skills"],
"configSchema": {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Re-add Feishu skills path to manifest

Removing the skills entry here prevents the Feishu bundled skills (extensions/feishu/skills/*/SKILL.md) from loading at runtime: resolvePluginSkillDirs explicitly skips plugins with empty record.skills (src/agents/skills/plugin-skills.ts:38), and the workspace skill loader only imports plugin skill dirs from that list (src/agents/skills/workspace.ts:453). Tool registration still happens via registerFull in extensions/feishu/index.ts:55, so this change does not fix duplicate tool registration but does drop Feishu-specific operational guidance from agent prompts.

Useful? React with 👍 / 👎.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Mar 23, 2026

Greptile Summary

This PR fixes duplicate tool registration in the Feishu plugin by removing the "skills": ["./skills"] field from extensions/feishu/openclaw.plugin.json (and the corresponding generated metadata). The root cause was two overlapping initialization paths: the skills auto-discovery path and the explicit registerFull() call in index.ts were both registering the same Feishu tools, causing every tool (doc, chat, wiki, drive, perm, bitable) to appear twice.

  • The fix is minimal and correct — the registerFull() path in index.ts is the authoritative registration path and already covers all tool initialization alongside setRuntime and channel registration.
  • src/plugins/bundled-plugin-metadata.generated.ts is correctly updated to stay in sync with the source manifest.
  • Worth a follow-up check: The extensions/feishu/skills/ directory contains detailed SKILL.md guidance files (feishu-doc, feishu-drive, feishu-perm, feishu-wiki) that were previously installed via the skills field. These files contain useful agent context (token extraction patterns, action examples, permission requirements, caveats). Confirm that equivalent guidance is already embedded in the tool descriptions registered by registerFeishuDocTools etc., or consider explicitly wiring these guides into the registerFull path to preserve agent context.

Confidence Score: 4/5

  • Safe to merge — cleanly eliminates duplicate tool registration with no functional regressions to the tool implementations themselves.
  • The change is a focused one-liner in the source manifest plus a mechanical update to the generated metadata. The duplicate registration bug is clearly real (confirmed by the PR description logs) and the fix correctly targets it. A point is held back because the removal of the skills auto-discovery path also stops the installation of four detailed SKILL.md agent guidance files, and it's unclear whether that context is redundantly covered by the TypeScript tool descriptions — this warrants a quick verification before considering the fix fully complete.
  • extensions/feishu/openclaw.plugin.json — verify the SKILL.md guidance previously installed via "skills": ["./skills"] is still reachable by the agent after this change.

Comments Outside Diff (1)

  1. extensions/feishu/openclaw.plugin.json, line 1-9 (link)

    SKILL.md guides may no longer be installed

    Removing "skills": ["./skills"] stops the auto-installation of the agent guidance files under extensions/feishu/skills/ — specifically feishu-doc/SKILL.md, feishu-drive/SKILL.md, feishu-perm/SKILL.md, and feishu-wiki/SKILL.md. These files contain detailed operational context (token extraction patterns, action examples, permission requirements, known limitations) that the agent uses when working with Feishu tools.

    The registerFull() path in index.ts registers the TypeScript tool implementations but does not appear to install these markdown skill guides. If the skill guides were acting as both a registration path and a context source, removing this field addresses the duplicate tool registration but might silently drop the guidance layer.

    Worth confirming that the tool descriptions registered by registerFeishuDocTools, registerFeishuDriveTools, etc. already embed equivalent context, or alternatively, that these SKILL.md files should be re-wired into the registerFull path via explicit api.installSkill() / equivalent calls.

Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/feishu/openclaw.plugin.json
Line: 1-9

Comment:
**SKILL.md guides may no longer be installed**

Removing `"skills": ["./skills"]` stops the auto-installation of the agent guidance files under `extensions/feishu/skills/` — specifically `feishu-doc/SKILL.md`, `feishu-drive/SKILL.md`, `feishu-perm/SKILL.md`, and `feishu-wiki/SKILL.md`. These files contain detailed operational context (token extraction patterns, action examples, permission requirements, known limitations) that the agent uses when working with Feishu tools.

The `registerFull()` path in `index.ts` registers the TypeScript tool implementations but does not appear to install these markdown skill guides. If the skill guides were acting as both a registration path *and* a context source, removing this field addresses the duplicate tool registration but might silently drop the guidance layer.

Worth confirming that the tool descriptions registered by `registerFeishuDocTools`, `registerFeishuDriveTools`, etc. already embed equivalent context, or alternatively, that these SKILL.md files should be re-wired into the `registerFull` path via explicit `api.installSkill()` / equivalent calls.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (2): Last reviewed commit: "chore(feishu): regenerate bundled plugin..." | Re-trigger Greptile

Remove 'skills' from the generated metadata to match the plugin.json
change in the parent commit. The generated snapshot must stay in sync
with the source plugin.json files or the CI check will fail.
@QuinnH496
Copy link
Copy Markdown
Contributor Author

QuinnH496 commented Mar 23, 2026

Thanks @greptile-apps — you're right. Updated src/plugins/bundled-plugin-metadata.generated.ts to remove the stale skills: ["./skills"] entry from the feishu metadata snapshot. Both files are now in sync with the plugin.json change.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: feishu Channel integration: feishu size: XS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: **Feishu plugin registers all tools twice**

1 participant