Skip to content

[Bug]: msteams plugin npm install can leave an empty dependency tree — plugin loads, provider dies silently, Microsoft sees delivery errors #101049

Description

@packwood

Bug type

Behavior bug (incorrect output/state without crash)

Summary

openclaw plugins install @openclaw/msteams (npm flow) created the plugin project directory with package.json + package-lock.json but an empty/incomplete dependency tree@microsoft/teams.apps, @microsoft/teams.api, express, and @azure/identity were all unresolvable from the installed plugin. The plugin's npm install step apparently never completed (or was interrupted) and nothing surfaced this: no install-time error was persisted, plugins list showed the plugin as present, and the gateway attempted to load it every startup.

Steps to reproduce

  1. Install the msteams channel plugin via the npm flow (host 2026.6.11, macOS, node 24).
  2. Inspect ~/.openclaw/npm/projects/openclaw-msteams-<hash>__openclaw-generation__…/node_modules/@openclaw/msteams/node_modules/ — bundled deps missing.
  3. Start the gateway; configure channels.msteams.

Expected behavior

Either the install fails loudly (non-zero exit, plugins list marks it broken), or a load-time check reports the unresolvable imports. Ideally openclaw doctor verifies that a plugin's declared bundledDependencies actually resolve from its install root.

Actual behavior

Silent failure at the worst layer: Microsoft's webhook deliveries failed (Bot Framework test pane showed "There was an error sending this message to your bot") while the local install looked healthy. Nothing in the file log tied the failure to missing plugin dependencies. Manually running npm ci --ignore-scripts inside the plugin project directory restored the dependency tree and the provider started cleanly on the next gateway restart.

OpenClaw version

2026.6.11 (plugin @openclaw/msteams 2026.6.11)

Operating system

macOS 15 (Darwin 25.5.0), node 24.14.0, npm global install

Additional information

  • The plugin declares its deps as bundledDependencies, so a normal registry install should have shipped them inside the tarball — worth checking whether the __openclaw-generation__ project flow re-installs from package-lock.json and can end up half-done if interrupted.
  • Suggested cheap guard: after plugin install (and/or in doctor), require.resolve each direct dependency from the plugin root and fail/flag on a miss.
  • Possibly related to the nested-install resolution work in fix(plugins): resolve public artifacts from installed plugin roots #98819, but this is about the dependency tree being absent, not resolution paths.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0Emergency: data loss, security bypass, crash loop, or unusable core runtime.clawsweeper:needs-live-reproClawSweeper needs live local, crabbox, or manual validation to confirm this issue.impact:message-lossChannel message delivery can be lost, duplicated, or misrouted.impact:ux-release-blockerA non-technical user is blocked without terminal, logs, config, or support.issue-rating: 🐚 platinum hermitGood issue quality with a plausible reproduction path needing some confirmation.maturity:stableIssue affects a taxonomy feature currently scored M4/M5.staleMarked as stale due to inactivity

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions